我无法连接两个客户端 . 是bcoz我使用DataOutputStream和DataInputStream而不是BufferedReader和PrintWritter?由于某种原因,即使我将服务器套接字和套接字设置为通过localhost和端口8000进行互连,它也不会相互连接 .
我无法在这两个客户端之间发送消息 . 但是,是的,他们可以连接到服务器 . 但是,我希望我的客户相互沟通,以便它像在线聊天一样工作 .
服务器端:
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class Server extends JFrame {
// Text area for displaying contents
private static JTextArea jta = new JTextArea();
public static void main(String[] args) {
new Server();
}
public Server() {
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("Server");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); // It is necessary to show the frame here!
// Place text area on the frame
try {
// Create a server socket
ServerSocket serverSocket = new ServerSocket(8000);
jta.append("Server started at " + new Date() + '\n');
try {
while (true) {
new Handler(serverSocket.accept()).start();
}
} finally {
serverSocket.close();
}
}
catch(IOException ex) {
System.err.println(ex);
}
}
public static class Handler extends Thread{
Socket socket;
DataInputStream inputFromClient;
DataOutputStream outputToClient;
public Handler(Socket socket){
this.socket = socket;
}
public void run(){
// Listen for a connection request
//Socket socket = serverSocket.accept();
try{
// Create data input and output streams
inputFromClient = new DataInputStream(socket.getInputStream());
outputToClient = new DataOutputStream(socket.getOutputStream());
while (true) {
// Receive data from the client
String message =inputFromClient.readUTF();
System.out.println("Server: Receive input");
jta.append("Word received from client: " + message + '\n');
// DO converting process
//String newMessage ="";
//newMessage= message.toUpperCase();
// Send data back to the client
outputToClient.writeUTF(message);
//jta.append("Word Converted: " + newMessage + '\n');
}
}catch(IOException ex) {
System.err.println(ex);
}
}
}
}
客户端
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Client extends JFrame {
// Text field for receiving data
private JTextField jtf = new JTextField();
// Text area to display contents
private JTextArea jta = new JTextArea();
// IO streams
private DataOutputStream toServer;
private DataInputStream fromServer;
public static void main(String[] args) {
new Client();
}
public Client() {
// Panel p to hold the label and text field
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Enter word: "), BorderLayout.WEST);
p.add(jtf, BorderLayout.CENTER);
jtf.setHorizontalAlignment(JTextField.RIGHT);
setLayout(new BorderLayout());
add(p, BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
jtf.addActionListener(new Listener()); // Register listener
setTitle("Client");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); // It is necessary to show the frame here!
try {
// Create a socket to connect to the server
Socket socket = new Socket("localhost", 8000);
// Socket socket = new Socket("130.254.204.36", 8000);
// Socket socket = new Socket("drake.Armstrong.edu", 8000);
// Create an input stream to receive data from the server
fromServer = new DataInputStream(
socket.getInputStream());
// Create an output stream to send data to the server
toServer =
new DataOutputStream(socket.getOutputStream());
}
catch (IOException ex) {
jta.append(ex.toString() + '\n');
}
}
private class Listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
// Get the data from the text field
String message = (jtf.getText().trim());
// Send the data to the server
toServer.writeUTF(message);
// Get data from the server
String serverMessage = fromServer.readUTF();
System.out.println("from server");
// Display to the text area
jta.append("Word is " + message + "\n");
jta.append("Word received from the server is "
+ serverMessage + '\n');
toServer.flush();
}
catch (IOException ex) {
System.err.println(ex);
}
}
}
}
2 回答
您的软件不是为处理客户端与客户端的通信而设计的 .
要实现这一目标,您必须:
将您的客户端处理程序存储在服务器上(不要丢弃它们;使用像LinkedList这样的动态内容)
向Handler添加一个方法,允许向Handler表示的客户端发送任意消息
在处理程序中接收客户端消息
将它们传递给服务器
使用sending方法将消息发送到列表中的客户端
我有点像1999年“我只能告诉你门 . 你是那个必须走过它的人 . ”但是今天似乎看到了这种不同 . 所以我们走了 .
服务器:
客户:
quick and dirty 编辑您的代码 .
这不会处理丢弃连接并将消息分发给所有客户端的客户端,但是您应该得到一个起点 .
我在java套接字中遇到了很多问题然后解决了问题:
只是使用java套接字提供服务器端代码和虚拟客户端代码:
server
然后我创建了一个包含以下代码的线程 REQUEST HANDLER
所以上面的代码完全是我的服务器代码 . 然后我的客户端代码是:
在这里,我有一个名为 RESPONSE HANDLER: 的主题
这样做没有任何错误 . 但是,如果你需要检查你的IP端口,那么它是开放的还是不开放的 . 希望它能帮助.. :)
P.S:Prefre在您的服务器和客户端通信中使用线程,因为它会更有效..!