java实现最基础的socket网络通信
2015-07-13 14:01 itwolf 阅读(12244) 评论(1) 编辑 收藏 举报一、网络通信基础
网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址。
而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分。
二、java中的基本网络支持
1、IP地址使用InetAddress类来表示。
获取InetAddress实例的两个方法为:
(1)getByName(String host) 根据主机获取对应的InetAddress对象
(2)getByAddress(byte[] addr)根据IP地址获取InetAddress对象
2、InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名
(1)String getCanonicalHostName()获取此IP地址的权限定域名
(2)String getHostAddress()获取InetAddress实例对应的IP地址
(3)String getHostName()获取此IP地址的主机名
此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否可以到达该地址。
三、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)); } } }