基于TCP编程的socket

什么是TCP/IPUDP

         TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
         UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
        这里有一张图,表明了这些协议的关系。

                                                                                

                                                                        图1

       TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IPUDP的关系了吧。
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编程一定要注意读写,客户端读入得信息是服务器写出的信息,客户端写出的信息是服务器要读入的信息,反之亦然。

 

posted @ 2013-10-14 21:07  用户没有名  阅读(289)  评论(0编辑  收藏  举报