• Java使用TCP聊天程序


    前面使用了UDP进行通信的聊天程序

    现在做一个用TCP进行通信的聊天程序

    原理:

    ServerSocket Socket

    1.开一个线程监听端口,准备接收消息

    2.不断接受消息发送到目的端口

    P.S.因为TCP是面向连接的所以中间要注意先后顺序,代码写得有点乱

      1 import java.io.IOException;
      2 import java.io.InputStream;
      3 import java.io.OutputStream;
      4 import java.net.InetAddress;
      5 import java.net.ServerSocket;
      6 import java.net.Socket;
      7 import java.util.Scanner;
      8 
      9 /**
     10  * 聊天程序
     11  * TCP实现
     12  * 开一个线程监听一个端口,接收消息
     13  * @author GXF
     14  *
     15  */
     16 public class TcpChatWindow {
     17     private int destPort;                        //目的端口
     18     private int listenPort;                        //监听端口
     19     private Socket socketToSendMessage;            //发送消息的socket
     20     
     21     public TcpChatWindow(int destPort, int listenPort){
     22         this.destPort = destPort;
     23         this.listenPort = listenPort;
     24         
     25         //init
     26         init();
     27     }
     28     
     29     /**
     30      * 接收消息线程
     31      * @author GXF
     32      *
     33      */
     34     class ReceiveMessageThread implements Runnable{
     35         //接收消息socket
     36         private ServerSocket receiveMessageSocket;
     37         
     38         @Override
     39         public void run() {
     40             //init
     41             init();
     42             while(true){
     43                 try {
     44                     Socket clientSocket = receiveMessageSocket.accept();
     45                     InputStream inputStreamOfClientSocket = clientSocket.getInputStream();
     46                     byte buff[] = new byte[1024];
     47                     int lengthOfMessage = -1;
     48                     StringBuilder sb = new StringBuilder();
     49                     //read message
     50                     while((lengthOfMessage = inputStreamOfClientSocket.read(buff)) > 0){
     51                         sb.append(new String(buff, 0, lengthOfMessage));
     52                     }//while
     53                     //输出消息到控制台
     54                     System.out.println(sb.toString());
     55                     //关闭socket
     56                     clientSocket.close();
     57                 } catch (IOException e) {
     58                     e.printStackTrace();
     59                 }
     60             }
     61         }
     62         
     63         /**
     64          * 对线程进行初始化
     65          */
     66         public void init(){
     67             try {
     68                 receiveMessageSocket = new ServerSocket(listenPort);
     69             } catch (IOException e) {
     70                 e.printStackTrace();
     71             }
     72         }
     73         
     74     }
     75     
     76     //初始化操作
     77     private void init(){
     78             
     79         //start ReceiveMessageThread
     80         Thread receiveMessageThread = new Thread(new ReceiveMessageThread());
     81         receiveMessageThread.start();
     82         //input message and send message
     83         while(true){
     84             Scanner scanner = new Scanner(System.in);
     85             String messageToSend = scanner.nextLine();
     86 //            getSocketToSendMessage();
     87             sendMessage(messageToSend);
     88             scanner.close();
     89         }
     90             
     91         
     92     }
     93     
     94     /**
     95      * 向对方发送消息
     96      * @param message
     97      */
     98     public void sendMessage(String message){
     99         try {
    100             Socket socketToSendMessage = new Socket(InetAddress.getByName("127.0.0.1"), destPort);
    101             OutputStream outputStreamOfClientSocket = socketToSendMessage.getOutputStream();
    102             byte bytesOfMessage[] = message.getBytes();
    103             outputStreamOfClientSocket.write(bytesOfMessage);
    104             socketToSendMessage.close();
    105         } catch (IOException e) {
    106             e.printStackTrace();
    107         }
    108     }
    109     
    110     //获取发送消息的socket
    111     public Socket getSocketToSendMessage(){
    112         if(socketToSendMessage == null){
    113             try {
    114                 socketToSendMessage = new Socket(InetAddress.getByName("127.0.0.1"), destPort);
    115             } catch (IOException e) {
    116                 // TODO Auto-generated catch block
    117                 e.printStackTrace();
    118             }
    119         }
    120         return socketToSendMessage;
    121     }
    122     
    123     public static void main(String args[]){
    124         if(args.length != 2){
    125             System.out.println("usage: java TcpChatWindow destport listenport");
    126             return;
    127         }
    128         int destPort = Integer.valueOf(args[0]);
    129         int listenPort = Integer.valueOf(args[1]);
    130         
    131         TcpChatWindow chatWindow = new TcpChatWindow(destPort, listenPort);
    132     }
    133 }
  • 相关阅读:
    同一根域名的多站点登录共享
    mysql忘记管理员密码
    使用Cacti监控你的网络(四) Cacti脚本及模板
    使用Cacti时常见的问题集
    SQL Server:SQL Like 通配符特殊用法:Escape
    IS6.0 应用程序池Web园导致Session丢失
    VMware建立虚拟机无法上网
    SqlServer 添加用户 添加角色 分配权限
    教你如何在SQL Server数据库中加密数据
    sendmail邮件服务器搭载smtp和pop3认证的配置方法
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4930419.html
Copyright © 2020-2023  润新知