JAvaはsocketチャットを実現する

7896 ワード

ソケットはソケットとも呼ばれ、ソケットはTCPを使用して2台のコンピュータ間の通信メカニズムを提供します.
クライアント・プログラムはソケットを作成し、サーバに接続しようとします.接続が確立されると、サーバはSocketオブジェクトを作成します.クライアントとサーバは、Socketオブジェクトの書き込みと読み取りによって通信できるようになりました.ServerSocketクラスは、サーバがクライアントをリスニングし、接続を確立するメカニズムを提供します.
原理的には簡単ですが、2つのスレッドをそれぞれ開き、1つはサービス側、1つはクライアントとして開きます.
クライアントの役割は、主にポート上の情報をリスニングし、バイトストリームで読み取り、表示します.
同時にサーバクラスでは、情報の傍受と送信を同時に行うスレッドも必要です.前のクライアントに接続するたびに、リスニング情報を開くスレッドが必要です.
 
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;


public class Client {
    Socket socket;
    private static final int MESSAGE_SIZE = 1024;//             

    public static void main(String[] args) {
        new Client();
    }

    public Client() {
        try {
        // 45678 socket = new Socket("127.0.0.1", 45678); if (socket.isConnected() == true) { System.out.println(" "); new Thread() {// @Override public void run() { super.run(); InputStream in; try { in = socket.getInputStream(); byte[] b; while (true) { b = new byte[MESSAGE_SIZE]; in.read(b); System.out.println(" :" + new String(b)); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } OutputStream out = null; while (true) { Scanner scanner = new Scanner(System.in); String str = scanner.nextLine(); out = socket.getOutputStream(); out.write(str.getBytes()); out.flush(); if (str.equals("end")) { System.exit(0);// } } } catch (IOException e) { e.printStackTrace(); } } }

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;



public class Server {

    List receiveList = new ArrayList<>();//         
    private final static int MESSAGE_SIZE = 1024;//             
    int num = 0;//     

    public static void main(String[] args) {
        new Server();
    }

    //       
    Server() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(45678);//        ,     
            while (true) {
                Socket socket = serverSocket.accept();//       ,    
                System.out.println("      :" + num);
//                 
                ReceiveThread receiveThread = new ReceiveThread(socket, num);
                receiveThread.start();
                receiveList.add(receiveThread);

                //       ,           
                String notice = "       ,        :   :";
                for (ReceiveThread thread : receiveList) {
                    notice = notice + "" + thread.num;
                }
                for (ReceiveThread thread : receiveList) {
                    new SendThread(thread.socket, notice).start();
                }
                num++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //       (           socket   )
    class ReceiveThread extends Thread {
        int num;
        Socket socket;//         
        boolean continueReceive = true;//             

        public ReceiveThread(Socket socket, int num) {
            this.socket = socket;
            this.num = num;
            try {
                //          ,           
                socket.getOutputStream().write(("        " + num).getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            super.run();
            //          
            InputStream inputStream = null;
            try {
                inputStream = socket.getInputStream();
                byte[] b;
                while (continueReceive) {
                    b = new byte[MESSAGE_SIZE];
                    inputStream.read(b);
                    b = splitByte(b);//        
                    //  end        
                    if (new String(b).equals("end")) {
                        continueReceive = false;
                        receiveList.remove(this);
                        //       
                        String message = "   " + num + "    
" + " , :"; for (ReceiveThread receiveThread : receiveList) { message = message + " " + receiveThread.num; } System.out.println(message); for (ReceiveThread receiveThread : receiveList) { new SendThread(receiveThread.socket, message).start(); } } else { try { String[] data = new String(b).split(" ", 2);// , int clientNum = Integer.parseInt(data[0]);// , // for (ReceiveThread receiveThread : receiveList) { if (receiveThread.num == clientNum) { new SendThread(receiveThread.socket, " " + num + " :" + data[1]).start(); System.out.println(" " + num + " " + receiveThread.num + ": " + data[1]); } } } catch (Exception e) { new SendThread(socket, " , ").start(); System.out.println(" "); } } } } catch (IOException e) { e.printStackTrace(); } finally { try {// if (inputStream != null) { inputStream.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } } // class SendThread extends Thread { Socket socket; String str; public SendThread(Socket socket, String str) { this.socket = socket; this.str = str; } @Override public void run() { super.run(); try { socket.getOutputStream().write(str.getBytes()); } catch (IOException e) { e.printStackTrace(); } } } // byte private byte[] splitByte(byte b[]) { int i = 0; for (; i < b.length; i++) { if (b[i] == 0) { break; } } byte[] b2 = new byte[i]; for (int j = 0; j < i; j++) { b2[j] = b[j]; } return b2; } }