JAVA服务器与客户端的socket通信问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA服务器与客户端的socket通信问题相关的知识,希望对你有一定的参考价值。

现有一个JAVA服务器和客户端A,B和C,D,根据“http://zhidao.baidu.com/question/419305670.html?quesup2&oldq=1”的代码,能实现通信,不过这时,当一个客户端发出消息时,服务器是广播给所有人的,所以我想要在此基础上,改成A发出消息,只转发给C,B发出消息只转发给D。
查了些东西,说是建立两个LinkedList,一个存放A,B另一个存放C,D。然后A发消息的时候同时把自己的ID也发到服务器,然后服务器找到事先定义的与A相匹配的C,再把A的消息发给C。
感觉好像很有道理,但是我JAVA新手,即使知道了思路也不会写,所以请哪位大神能教教我,帮我完成这部分的代码,先谢谢了
额……在那个问题那儿居然不能补充问题,只能到这儿来补充,百度抽风了吗……
根据我的理解,你的这段代码是根据客户端的IP进行选择发送的,但是我们老师的要求好像是自定义一个协议,A客户端发送一个数组,数组的前四个字节是ID,后面再跟8个字节存放一串数字消息,服务器用byte[]接受数组,取出这个数组的前四字节,识别出A,加入到甲集合中;C客户端连接上服务器时也发送一个相同格式的数组,不过其中后8个字节中并不包含消息,服务器根据C发送的数组的前四个字节识别出C,加入到乙集合中;服务器根据A发过来的数组的的前四个字节,去乙集合中遍历寻找前四个字节和A的前四个字节相匹配的客户端发来的数组,然后把A发来的整个数组(包括前四个字节)发送到从乙集合中找到的那个C客户端。
也就是说,选择要发送的客户端的时候不依靠客户端的IP,而是靠客户端发来的数组中的消息

你可以在每个用户连上服务器端时,都发送一个消息,就是用4个字节表示是用户的ID,并将与用户通信的socket,用一个HashMap存储起来,而不是用LinkList。<ID,Socket>

后面如果A发送消息给C,就把A的前四个字节(即ID)取出来,在HashMap中找到与C通信的socket,然后把消息通过socket发送出去···· 这部分代码应该很容易实现的,Socket通信这东西,理清了思路就很好弄了~~追问

你好,我是完全的新手,对于你说的方法不知道该怎么写代码,如果可以的话,请问能按照那你的方法,帮我写一份吗?因为我现在有些急用,所以没多少时间去自己慢慢学习了……谢谢了

参考技术A 根据你描述的意思,可以这样做:(就像cs联机对战,要先选择警匪,同队直接可以互相聊天)
客户机启动:
请选择你的阵营:红方 or 蓝方
TCP/IP连接到Server时发送信息
[0001][XXXXXXXX] 红方
or
[0000][XXXXXXXX] 蓝方
服务端:
接收客户机信息,解析阵营标识,加入阵营列表
for(所有已连接客户机)
if( XO )
广播给相同阵营的客户机

Java Socket Server与Python客户端的通信,程序不会输入“inputLine = in.readLine()” - 循环

我正在尝试用Java创建一个可以与python客户端通信的套接字服务器。我遇到的问题是,如果我启动服务器,通过python发送消息,然后立即退出,一切都正常,但如果客户端发送消息然后再次侦听套接字,服务器将不会响应。

这是代码,主要来自this example from oracle

public class PrimeServer {

    public static void main(String[] args) throws IOException {

        int portNumber = 4444;

        try (
                ServerSocket serverSocket = new ServerSocket(portNumber);
                Socket clientSocket = serverSocket.accept();
                PrintWriter out =
                        new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()))
        ) {

            String inputLine;
            String outputLine;
            String rawMessage;

            // Initiate conversation with client
            PrimeProtocol ppc = new PrimeProtocol();
            outputLine = String.format("%1022s", "Ready").replace(' ', '0');
            out.println(outputLine);
            System.out.println("Over while");
            while ((inputLine = in.readLine()) != null) {
                System.out.println("In while");
                if (ppc.processInput(Integer.parseInt(inputLine))){
                    rawMessage = "True";
                } else {
                    rawMessage = "False";
                }
                outputLine = String.format("%1024s", rawMessage).replace(' ', '0');
                System.out.println("Outputting " + rawMessage);
                out.println(outputLine);

            }
            System.out.println("Passed while.");
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port "
                    + portNumber + " or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}

和python代码的好措施:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
init_message = init_message.replace('0', '')
print(init_message)
print(len(init_message))
sock.send(b'3')

使用此代码,java服务器的输出是:

Over while
In while
Outputting True
Passed while.

客户端输出是:

1024
Ready

之后连接断开。

但是如果我将这一行添加到客户端:new_message = sock.recv(msg_len).decode("UTF-8")制作新的python:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
print(len(init_message))
init_message = init_message.replace('0', '')
print(init_message)

sock.send(b'3')

new_message = sock.recv(msg_len).decode("UTF-8")

服务器卡住并且输出仅为:

Over while

客户输出:

1024
Ready

同时也是干扰。

有什么想法在这里发生了什么?

答案

原来它是需要刷新的python套接字。新的python代码:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
print(len(init_message))
init_message = init_message.replace('0', '')
print(init_message)

sock.send(b'3
')

new_message = sock.recv(msg_len).decode("UTF-8")
print(new_message)

(添加 n)消息传出。

以上是关于JAVA服务器与客户端的socket通信问题的主要内容,如果未能解决你的问题,请参考以下文章

java 界面编程用socket实现服务端与客户端的循环通信。

JAVA客户端与服务端Socket通信问题

java服务端与c++客户端的socket通信问题

Java 网络编程

java服务端如何获得客户端的ip

PHP的Socket怎么进行服务端与客户端的相互通信?