zoukankan      html  css  js  c++  java
  • 网络Socket编程TCP协议例子

     1.单线程TCP服务端

     1 public class TcpChatServer {
     2 
     3     private Integer port=8000;
     4     private ServerSocket serverSocket;
     5     
     6     public static void main(String[] args)throws Exception  {
     7         
     8         new TcpChatServer().service();
     9     }
    10     
    11     public TcpChatServer() throws Exception {
    12         //启动一个服务监听一个指定的端口port
    13         serverSocket=new ServerSocket(port);
    14         System.out.println("service started!");
    15     }
    16     
    17     private void service(){
    18         while (true) {
    19             Socket socket=null;
    20             try {
    21                 //serversocket开始监听服务,客户端和服务端交互的socket
    22                 socket=serverSocket.accept();
    23                 System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
    24                 //获取客户端的数据对象
    25                 BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    26                 //写入客户端的数据对象
    27                 PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
    28                 String word;
    29                 while ((word=reader.readLine())!=null) {
    30                     //相应请求
    31                     writer.println(reply(word));
    32                     //如果用户输入bye则退出循环
    33                     if(word.equals("bye")){
    34                         break;
    35                     }
    36                 }
    37             } catch (IOException e) {
    38                 System.err.println(e.getMessage());
    39             }finally{
    40                 //一定要关闭socket
    41                 if(socket!=null){
    42                     try {
    43                         socket.close();
    44                     } catch (IOException e) {
    45                         System.err.println(e.getMessage());
    46                     }
    47                 }
    48             }
    49         }
    50     }
    51     
    52      //回复相应
    53     private String reply(String word){
    54         return "you said :"+word;
    55     }
    56 }

    运行...在cmd下访问....使用telnet访问....

     

     但是有一个问题...如果再开一个telnet访问的话输入什么都是没有效果的...只有等到第一个结束之后才会对第二个访问的telnet进行回复,如下图.

     

     搞一个多线程的Socket服务端.

     1 public class TcpThreadChatServer {
     2 
     3     private Integer port=8000;
     4     private ServerSocket serverSocket;
     5     
     6     public static void main(String[] args)throws Exception  {
     7         
     8         new TcpThreadChatServer().service();
     9     }
    10     
    11     public TcpThreadChatServer() throws Exception {
    12         //启动一个服务监听一个指定的端口port
    13         serverSocket=new ServerSocket(port);
    14         System.out.println("service started!");
    15         
    16     }
    17     
    18     private void service(){
    19         
    20         while (true) {
    21             Socket socket=null;
    22             
    23             try {
    24                 //serversocket开始监听服务,客户端和服务端交互的socket
    25                 socket=serverSocket.accept();
    26                 //对于每次请求,多线程应答  可以开多个可以对多个客户端进行回应.
    27                 new Thread(new Worker(socket)).start();
    28             } catch (IOException e) {
    29                 System.err.println(e.getMessage());
    30             }
    31         }
    32     }
    33     
    34     class Worker implements Runnable{
    35         public Worker(Socket socket) {
    36             this.socket = socket;
    37         }
    38         private Socket socket;
    39         
    40         @Override
    41         public void run() {
    42             
    43             try {
    44                 System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
    45                 //获取客户端的数据对象
    46                 BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    47                 //写入客户端的数据对象
    48                 PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
    49                 String word;
    50                 while ((word=reader.readLine())!=null) {
    51                     //相应请求
    52                     writer.println(reply(word));
    53                     //如果用户输入bye则退出循环
    54                     if(word.equals("bye")){
    55                         break;
    56                     }
    57                 }
    58             } catch (Exception e) {
    59                 System.err.println(e.getMessage());
    60             }finally{
    61                 if(socket!=null){
    62                     try {
    63                         socket.close();
    64                     } catch (IOException e) {
    65                         System.err.println(e.getMessage());
    66                     }
    67                 }
    68             }
    69         }
    70     }
    71     
    72      //回复相应
    73     private String reply(String word){
    74         return "you said :"+word;
    75     }
    76 }

    可以开启多个telnet访问 并同时处理反馈.....

    可以写对应的如下客户端...通过控制台访问该服务端,不再使用telnet...

     1 public class TcpChatClient {//客户端和服务端通话都是过socket
     2 
     3     private Socket socket;
     4     private String host="localhost";//要请求的服务器地址
     5     private Integer port=8000;
     6     
     7     public TcpChatClient() throws Exception {
     8         //初始化一个客户端socket
     9         socket=new Socket(host, port);
    10         System.out.println("connect ok!");
    11     }
    12     
    13     public static void main(String[] args) throws Exception {
    14         
    15         new TcpChatClient().say();
    16     }
    17 
    18     private void say() throws Exception {
    19         //两个reader对象
    20         //本地的system.in 的reader
    21         BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
    22         //和服务器交互的writer【PrintWriter 的自动flush 功能】  这个ture参数非常重要  .
    23         PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
    24         //和服务器交互的reader
    25         BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    26         
    27         String word;
    28         String readLine;
    29         while ((word=localReader.readLine())!=null){
    30             //请求服务端来获取数据
    31             writer.println(word);
    32             //打印到控制台上
    33             readLine = reader.readLine();
    34             System.out.println(readLine);
    35             
    36             //如果用户输入bye则退出循环 
    37             if (word.equals("bye")){
    38                 socket.close();
    39                 break;
    40             }
    41         }
    42     }
    43 }
  • 相关阅读:
    关于ping github.com超时的解决办法
    git使用过程中的若干问题笔记
    PAT甲级1017题解——模拟排序
    第七章4
    第七章3
    第七章2
    第七章1
    第六章4
    第六章3
    第六章2
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6681390.html
Copyright © 2011-2022 走看看