基于TCP编程的socket
什么是TCP/IP、UDP?
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系。
图1
TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
Socket在哪里呢?
在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。
图2
原来Socket在这里。
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
你会使用它们吗?
前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。
客户端代码:
1 package com.socket; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.InetAddress; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 public class OneClient { 12 13 public static void main(String[] args) throws UnknownHostException, IOException { 14 /**设置主机地址和端口号*/ 15 InetAddress address=InetAddress.getLocalHost(); 16 Socket socket=new Socket(address,123); 17 18 BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream())); 19 PrintWriter write=new PrintWriter(socket.getOutputStream()); 20 21 BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); 22 23 String line; 24 while((line=input.readLine())!=null){ 25 write.println(line);//向服务器输出 26 write.flush();//清空缓存 27 String responseinfo=read.readLine();//从服务器获取消息 28 System.out.println("服务器:"+responseinfo); 29 } 30 /**关闭流和socket*/ 31 read.close(); 32 write.close(); 33 socket.close(); 34 } 35 }
服务器端代码:
1 package com.socket; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 11 public class OneServer { 12 13 public static void main(String[] args) { 14 ServerSocket server=null; 15 16 try { 17 server = new ServerSocket(123); 18 System.out.println("服务器启动:"+server.getInetAddress().getHostAddress()+":"+server.getLocalPort()); 19 while(true){ 20 Socket socket=server.accept();//服务器接收客户端的请求信息 21 System.out.println("客户端连接:"+socket.getInetAddress().getHostAddress()+":"+socket.getLocalPort()); 22 23 BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream())); 24 PrintWriter write=new PrintWriter(socket.getOutputStream()); 25 26 BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); 27 String line; 28 while((line=read.readLine())!=null){ 29 System.out.println("客户端:"+line);//从客户端获得消息 30 if(line.equals("bye")){ 31 break; 32 }else{ 33 write.println(input.readLine());//向客户端发送消息 34 } 35 write.flush(); 36 } 37 read.close(); 38 write.close(); 39 socket.close(); 40 } 41 42 } catch (IOException e) { 43 44 e.printStackTrace(); 45 }finally{ 46 try { 47 server.close(); 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51 } 52 } 53 54 }
注意:socket编程一定要注意读写,客户端读入得信息是服务器写出的信息,客户端写出的信息是服务器要读入的信息,反之亦然。