1、网络通讯基础java
网络中存在不少的通讯实体,每个通讯实体都有一个标识符就是IP地址。服务器
而现实中每个网络实体能够和多个通讯程序同时进行网络通讯,这就须要使用端口号进行区分。网络
2、java中的基本网络支持socket
一、IP地址使用InetAddress类来表示。测试
获取InetAddress实例的两个方法为:大数据
(1)getByName(String host) 根据主机获取对应的InetAddress对象spa
(2)getByAddress(byte[] addr)根据IP地址获取InetAddress对象.net
二、InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名code
(1)String getCanonicalHostName()获取此IP地址的权限定域名对象
(2)String getHostAddress()获取InetAddress实例对应的IP地址
(3)String getHostName()获取此IP地址的主机名
此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否能够到达该地址。
3、java实现简单的TCP/IP通讯
服务器端使用ServerSocket建立TCP服务器,使用accept()进行监听,若是接收到客户端请求则返回一个与客户端对应的Socket,不然处于等待状态。
客户端根据服务器的IP,链接服务器。
服务器代码:
import java.net.*; import java.io.*; /** 手机端代码 手机端做为服务器,获取本身的ip地址,并显示以供客户端链接 */ public class phone_Server { public static void main(String[] args) throws IOException { //打印本机的IP地址 InetAddress address=InetAddress.getLocalHost(); System.out.println("本机的IP地址是"+address.getHostAddress()); // 建立一个ServerSocket,用于监听客户端Socket的链接请求 ServerSocket ss = new ServerSocket(30000); // 采用循环不断接受来自客户端的请求 while (true) { // 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket Socket s = ss.accept(); // 将Socket对应的输出流包装成PrintStream PrintStream ps = new PrintStream(s.getOutputStream()); // 进行普通IO操做 ps.println("您好,您收到了服务器的新年祝福!"); // 关闭输出流,关闭Socket ps.close(); s.close(); } } }
客户端代码:
/** PC端代码 PC做为客户端,根据服务器的IP地址和端口号链接服务器 */ import java.net.*; import java.io.*; public class PC_Client { public static void main(String[] args) throws IOException { //Socket socket = new Socket("127.0.0.1" , 30000); Socket socket = new Socket("192.168.47.1" , 30000);//这里的IP地址填写手机端服务器的IP地址 // 将Socket对应的输入流包装成BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 进行普通IO操做 String line = br.readLine(); System.out.println("来自服务器的数据:" + line); // 关闭输入流、socket br.close(); socket.close(); } }
补充一点socket传输大数据的内容
因为socket单次传输的数量是有必定的限制的,因此应该分批次传输和接受
能够写成这样:
传输
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); int start=0; while((start+1024)<data.length) { out.write(data, start,1024); start=start+1024; } if(start<data.length) { out.write(data, start,(data.length-start+1)); } //String str = new String(data); //out.writeUTF(str); }catch (Exception e) { Log.d(TAG, "文件传输异常"); }
接受
DataInputStream input = new DataInputStream(socket.getInputStream()); byte []buf=new byte[1024]; int readnum=0; while(true) { readnum=input.read(buf); if(readnum>0) { System.out.println(Arrays.toString(buf)); while((readnum=input.read(buf))>0) { System.out.println(Arrays.toString(buf)); } } }