Socket笔记

Socket又称套接字,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。


在Java中,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的对话。对于一个网络连接来说,套接字是平等的,并没有差别,不应为在服务器端或者在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。


Socket链接的建立过程:

  1. 服务器监听(SocketServer监听某个端口,阻塞线程,等待客户端访问这个端口,当有请求访问该端口,解除阻塞,accept()方法返回一个socket对象)

  2. 客户端发出请求(Socket(string ip, int port)客户端创建socket对象,连接服务器该端口)

  3. 建立链接 (客户端请求该端口,被服务器监听到,两个相对的socket相关联)

  4. 通信(客户端socket写入信息到输出流,则服务端的socket可以从输入流中读取,反则亦然)


Socket的特点:

  • Socket基于TCP协议,数据传输有保障

  • Socket适用于建立长时间链接

  • Socket编程通常应用于即时通讯




实例代码:使用JFrame实现一个简单聊天室

Eclipse安装WindowBuilder插件,可以实现拖拽控件的形式生成swing代码,

WindowBuilder插件安装地址:http://www.eclipse.org/windowbuilder/download.php

  1. Eclipse (Mars版):http://download.eclipse.org/windowbuilder/WB/release/R201506241200-1/4.5/

    点击Eclipse的功能栏的help-》install new software -》点击add按钮,填写上方1的url到Location中,完成安装。



客户端核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public  class  ChatManager {
 
     private  ChatManager(){}
     private  static  final  ChatManager instance =  new  ChatManager();
     public  static  ChatManager getCM() {
         return  instance;
     }
 
     MainWIndow window;
     Socket socket;
     BufferedReader reader;
     PrintWriter writer;
 
     public  void  setWindow(MainWIndow window) {
         this .window = window;
         window.appendText( "文本框已经和ChatManager绑定了。" );
     }
 
     public  void  connect(String ip) {  
         new  Thread(){
 
             @Override
             public  void  run() {
                 try  {
                     socket =  new  Socket(ip,  12345 );
                     writer =  new  PrintWriter(
                             new  OutputStreamWriter(
                                     socket.getOutputStream()));
 
                     reader =  new  BufferedReader(
                             new  InputStreamReader(
                                     socket.getInputStream()));
                     String line;
                     while  ((line = reader.readLine()) !=  null ) {
                         window.appendText( "收到:" +line);
                     }
                     writer.close();
                     reader.close();
                     writer =  null ;
                     reader =  null ;
                 catch  (UnknownHostException e) {
                     e.printStackTrace();
                 catch  (IOException e) {
                     e.printStackTrace();
                 }
             }
         }.start();
     }
 
     public  void  send(String out) {
         if  (writer !=  null ) {
             writer.write(out+ "\n" );
             writer.flush();
         } else  {
             window.appendText( "当前的链接已经中断" );
         }
     }
}


服务器端核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public  class  ChatManager {
 
     private  ChatManager(){}
     private  static  final  ChatManager cm =  new  ChatManager();
     public  static  ChatManager getChatManager() {
         return  cm;
     }
     
     Vector<ChatSocket> vector =  new  Vector<ChatSocket>();
     
     public  void  add(ChatSocket cs) {
         vector.add(cs);
     }
     
     public  void  remove(ChatSocket cs) {
         vector.remove(cs);
     }
     
     public  void  publish(ChatSocket cs,String out) {
         for  ( int  i =  0 ; i < vector.size(); i++) {
             ChatSocket csChatSocket = vector.get(i);
             if  (!cs.equals(csChatSocket)) {
                 csChatSocket.out(out);
             }
         }
     }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  class  ServerListener  extends  Thread {
 
     @Override
     public  void  run() {
         try  {
             ServerSocket serverSocket =  new  ServerSocket( 12345 );
             while  ( true ) {
                 //block
                 Socket socket = serverSocket.accept();
                 ChatSocket cs =  new  ChatSocket(socket);
                 cs.start();
                 ChatManager.getChatManager().add(cs);
             }
         catch  (IOException e) {
             e.printStackTrace();
         }
     }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值