Java实现Socket双向实时通信

通信过程图(有点暴力,如不适应请及时退出)

代码

TCPServer.java

package moe.iloli.socket;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


class ServerClient implements Runnable{
    Socket socket = null;
    public static OutputStream outputStream = null;
    public ServerClient(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        while (true) {
            try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = (bufferedReader.readLine());
                sendMsg(socket, msg);
            } catch (Exception e) {
                try {
                    socket.close();
                    TCPServer.arrayList.remove(socket);
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
                e.printStackTrace();
            }
        }
    }
    public void sendMsg(Socket socket, String clientMsg) throws Exception{
        for (Socket client : TCPServer.arrayList) {
            if (client == socket) {
                outputStream = socket.getOutputStream();
//                outputStream.write((clientMsg +"\n").getBytes());
                continue;
            }
            outputStream = client.getOutputStream();
            outputStream.write((clientMsg+"\n").getBytes());
        }
    }
}
public class TCPServer {
    public static ArrayList<Socket> arrayList = new ArrayList<>();
    protected static List<Socket> list = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(23333, 100,
                InetAddress.getByName("localhost"));
        System.out.println("您的抽象服务器已开启:" + serverSocket.getLocalSocketAddress());
        while (true) {
            Socket activeSocket = serverSocket.accept();
            arrayList.add(activeSocket);
            ServerClient serverClient = null;
            serverClient = new ServerClient(activeSocket);
            new Thread(serverClient).start();
        }
    }
}

TCPClient1.java

package moe.iloli.socket;

import java.io.*;
import java.net.Socket;

public class TCPClient1 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 23333);
        System.out.println("抽象客户端(A):"
                + socket.getLocalSocketAddress());
        BufferedReader socketReader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream()));
        BufferedReader clientReader = new BufferedReader(
                new InputStreamReader(System.in));
        String msg = null;
        while((msg = clientReader.readLine()) != null){
            socketWriter.write("Client (A): " + msg  + "\n");
            socketWriter.flush();
            String inMsg = socketReader.readLine();
            System.out.println(inMsg);
        }
        socket.close();
    }
}

TCPClient2.java

package moe.iloli.socket;

import java.io.*;
import java.net.Socket;

public class TCPClient1 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 23333);
        System.out.println("抽象客户端(A):"
                + socket.getLocalSocketAddress());
        BufferedReader socketReader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream()));
        BufferedReader clientReader = new BufferedReader(
                new InputStreamReader(System.in));
        String msg = null;
        while((msg = clientReader.readLine()) != null){
            socketWriter.write("Client (A): " + msg  + "\n");
            socketWriter.flush();
            String inMsg = socketReader.readLine();
            System.out.println(inMsg);
        }
        socket.close();
    }
}

当你跑完上面的代码后,恭喜你,你得到了一个错误的程序!

实际上真正的发送顺序是这样的

懒得改了,就这样吧

文章《Java实现Socket双向实时通信》采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: www.bilibili.com
Source: ななひら
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
嘉然
ななひら
小恐龙
花!
下一篇