- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我收到的问题陈述:
设计一个协议(protocol),其中服务器负责匹配两个聊天客户端。服务器在 TCP 端口上监听即将到来的连接。如果没有客户端连接到要配对的服务器,则服务器接受连接的客户端,并使其等待另一个客户端。为此,它会向连接客户端发送一条消息以等待。当收到此命令时,客户端构造另一个服务器套接字实例来监听端口。然后,客户端向服务器发送一条消息,其中包含新创建的服务器监听的端口号。当另一个客户端 C2 在 C1 等待期间寻求与服务器的连接时,服务器会通过向 C2 发送消息“PEER_LOC $h:$p”来通知 C2 C1 的存在,其中 $h 是 C1 的主机名(或 IP 地址),$p 是 C1 正在等待的端口号。 C2 收到此消息后,会使用获得的信息寻求与 C1 的连接。客户端从用户处获取消息。然后,两个客户端交换消息,直到任何一方发送流结束”(Linux 中的 Ctrl-D)。然后它们的守恒被终止。复杂的方法可能会使用多个线程、超时等,但在这个问题中不是必需的。
我的问题是将两个客户端连接到我的服务器。我运行我的服务器程序,然后运行另外两个客户端类,它们彼此重复,只是名称不同。我可以连接到其中一个,但另一个似乎永远等待。
这些是我开设的类(class)。
服务器:
package chatserver2;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
// import all the class that you will need for functionailty
// extends jframe to develop gui's in java
public class Server {
private static ObjectOutputStream output; // stream data out
private static ObjectInputStream input; // stream data in
private static ServerSocket server;
private static Socket connection; // socket means set up connetion between 2 computers
private static int n;
//Constructor
public static void main(String[] args) throws IOException {
Server obj = new Server();
obj.RunServer();
try {
while (true) {
Handler obj2 = new Handler();
obj2.start();
System.out.println("Accepted connection from "
+ connection.getInetAddress() + " at port "
+ connection.getPort());
n++;
System.out.println("Count " + n);
}
} finally {
connection.close();
}
}
public Server() {
}
// run the server after gui created
public void RunServer() {
try {
server = new ServerSocket(6789); // 1st number is port number where the application is located on the server, 2nd number is the amount of people aloud to connect
while (true) {
try {
waitForConnection(); // wait for a connection between 2 computers
setupStreams(); // set up a stream connection between 2 computers to communicate
whileChatting(); // send message to each other
// connect with someone and have a conversation
} catch (EOFException eofException) {
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
//Wait for a connection then display connection information
private void waitForConnection() {
try {
connection = server.accept();
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
}
// stream function to send and recive data
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out
output.flush(); // move data away from your machine
input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in
}
// this code while run during chat conversions
private void whileChatting() throws IOException {
String message = "WAIT ";
sendMessage(message);
do {
try {
message = (String) input.readObject(); // stores input object message in a string variable
System.out.println("Message from Client " + message);
} catch (ClassNotFoundException classnotfoundException) {
}
} while (!message.equals("CLIENT - END"));// if user types end program stops
}
private void closeChat() {
try {
output.close();
input.close();
connection.close();
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
}
// send message to the client
private void sendMessage(String message) {
try {
output.writeObject(message);
output.flush();
System.out.println("Message to client " + message);
} catch (IOException ioexception) {
}
}
public static class Handler extends Thread {
private Socket connection;
public Handler() {
String message = "WAIT";
}
public void run() {
System.out.println("Connect" + Server.connection);
while (true) {
try {
waitForConnection();
setupStreams();
whileChatting();
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void waitForConnection() {
System.out.println("server" + server);
try {
connection = server.accept();
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
System.out.println("Connection" + connection);
}
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out
output.flush(); // move data away from your machine
input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in
}
private void whileChatting() throws IOException {
String message = " You are now connected ";
sendMessage(message);
do {
try {
message = (String) input.readObject();
} catch (ClassNotFoundException classnotfoundException) {
}
} while (!message.equals("CLIENT - END"));
}
private void closeChat() {
try {
output.close();
input.close();
connection.close();
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
}
static private void sendMessage(String message) {
try {
output.writeObject(message);
output.flush();
} catch (IOException ioexception) {
}
}
}
}
一个重复的客户端类 C1 或 C2:
package chatserver2;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// import all the class that you will need for functionailty
// extends jframe to develop gui's in java
public class Client1 extends JFrame {
private JTextField userInput; //
private JTextArea theChatWindow; //
private ObjectOutputStream output; // stream data out
private ObjectInputStream input; // stream data in
private Socket connection; // socket means set up connetion between 2 computers
//Constructor
public Client1() {
}
// run the server after gui created
public void RunClient() {
try {
connection = new Socket("localhost", 6789);// 1st number is port number where the application is located on the server, 2nd number is the amount of people aloud to connect
while (true) {
try {
// wait for a connection between 2 computers
setupStreams(); // set up a stream connection between 2 computers to communicate
whileChatting(); // send message to each other
// connect with someone and have a conversation
} catch (EOFException eofException) {
} finally {
closeChat();
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
//Wait for a connection then display connection information
// stream function to send and recive data
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out
output.flush(); // move data away from your machine
input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in
}
// this code while run during chat conversions
private void whileChatting() throws IOException {
String message = "";
do {
// have conversion while the client does not type end
try {
message = (String) input.readObject(); // stores input object message in a string variable
System.out.println("message " + message);
if (message.equals("WAIT")) {
ServerSocket server2 = new ServerSocket(5000);
System.out.println("Hello");
message = "5000";
sendMessage(message);
}
System.out.println("From server " + message);
} catch (ClassNotFoundException classnotfoundException) {
}
} while (!message.equals("CLIENT - END"));// if user types end program stops
}
private void closeChat() {
try {
output.close(); // close output stream
input.close(); // close input stream
connection.close(); // close the main socket connection
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
}
// send message to the client
private void sendMessage(String message) {
try {
output.writeObject(" - " + message);
output.flush(); // send all data out
} catch (IOException ioexception) {
theChatWindow.append("\n ERROR: Message cant send");
}
}
//
//
public static void main(String[] args) {
Client1 obj = new Client1();
obj.RunClient();
}
}
我可以连接到我运行的第一个客户端,第二个客户端则永远等待。如有任何建议或意见,我们将不胜感激。
最佳答案
您正在阻止服务器周期。您应该为来自客户端的每个连接启动新线程。我会将 waitForConnection()
与 RunServer
方法中服务器循环中的下游代码分开。所以你的 while 循环应该是这样的:
public static void RunClient() {
...
while (true) {
try {
final Server srv = waitForConnection(); // wait for a connection between 2 computers
new Thread(new Runnable() {
public void run() {
try {
srv.setupStreams(); // set up a stream connection between 2 computers to communicate
srv.whileChatting(); // send message to each other
// connect with someone and have a conversation
} catch (EOFException ex) {
// ex.printStackTrace();
}
}
}).start();
} catch (EOFException eofException) {
}
}
在这种情况下,您必须为每个客户端创建服务器实例,并且您的服务器声明应包含与客户端相关的非静态属性,例如:
public class Server {
private ObjectOutputStream output; // stream data out
private ObjectInputStream input; // stream data in
private static ServerSocket server;
private Socket connection; // socket means set up connetion between 2 computers
...
服务器创建应该在 waitForConnection()
内进行,如下所示:
private static Server waitForConnection() {
try {
Socket connection = server.accept();
return new Server(connection);
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
}
这不是唯一的方法。您可以保留服务器类来负责在同一实例中运行主周期。但在这种情况下,我将创建一些与来自特定客户端的连接相关的附加类处理属性(连接、输入、输出)。
关于java - 编写点对点聊天系统时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705820/
我正在尝试实现这个协议(protocol):http://en.wikipedia.org/wiki/Chord_(peer-to-peer ) 我从中了解到的是,加入“圆圈”的每个节点都放置在圆圈内
我对 java 中的 cometd 很陌生。 我对 java 中的 cometd 更感兴趣,但是当我用 google 搜索它时,我几乎找不到一个链接这是 cometd 链接,文档中不清楚。 有人可以发
什么是编写 XNA 点对点游戏的最佳方式而不必使用要求游戏的两个玩家都具有 XBOX Gold 成员(member)资格的 Windows Live 东西 我还需要一些客户端/服务器功能,但这还不是很
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
假设我有 2 部手机,彼此相距 50 米,我想从手机 A 向手机 B 发送一个非常小的数据包,而不使用与蜂窝塔的任何通信。 为了简单起见,我想构建一个应用程序,为同一半径(同一区域)的 2 部手机实现
我听说过点对点内存传输并阅读了一些关于它的内容,但无法真正理解与标准 PCI-E 总线传输相比它的速度有多快。 我有一个使用多个 GPU 的 CUDA 应用程序,我可能对 P2P 传输感兴趣。我的问题
我从Android website中发现了这一点他们告诉我当前的 API使开发人员能够为 Wifi 点对点进行一些编程仅适用于 Android 4.0(API 级别 14)。 这是真的吗?我的意思是我
我正在为网页编写一个简单的 javascript 游戏。我将使用 tidesdk 将其转换为桌面。我想让不同机器上的玩家无需通过服务器进行通信。 一般来说这可能吗?这是套接字??您是否有使用 Java
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this q
我想在我的 iPhone 应用程序中加入 Paypal 作为点对点选项来回馈 friend 。然而,当我在网上搜索 Paypal iOS 时,它说我现在应该使用 Braintree。 它非常易于使用并
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我正在寻找一种使用 p2p 将客户端(网络浏览器)连接到服务器(没有外部 IP)的方法。 作为客户端语言,我想使用 javascript。 我正在阅读有关 WebRTC 点对点的信息,但我不知道它是否
我在 .NET 3.5 中使用 WCF 来实现对等网络应用程序。我使用 PNRP 解析对等节点。 IGlobalStoreServiceContract 是我的契约(Contract),如下所示, [
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何已知的方法可以在不使用专用中央服务器的情况下找到对等点? 即:如果我有对等方断开并重新连接到互联网但每次都获得一个新的 IP 地址,并且我想连接到他们而不设置专用服务器进行注册。 我正在考虑
我正在尝试将 Paypal 的自适应支付 API 集成到我的应用程序中,将只使用点对点交易,但我无法做任何与点对点支付相关的事情。我尝试使用这个工具 from Paypal 但我仍然没有取得任何成功。
我正在编写用于交换文本消息的点对点(它不应该有服务器 - 这是一项任务)程序。这是一个非常小的聊天。只是消息,没有别的。这是我第一次练习 Boost::Asio,因此我有一些问题。 正如我所说,我的聊
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我想使用 Python 和 Ubuntu 在两台计算机之间双向传输音频,最好使用 H.323 我看过 pjsip,但只能看到一种连接到 SIP 服务器的方式,而不是简单的点对点系统。 谁能指出我正确的
我有两个使用 vert.x EventBus 进行通信的 Java 类。 我有一个 Productor.java 类: package TP1; import io.vertx.core.Abstra
我是一名优秀的程序员,十分优秀!