我在连接两个客户端时遇到问题。我正在使用DataOutputStream和DataInputStream代替BufferedReader和PrintWritter吗?由于某些原因,即使我将服务器套接字和套接字通过本地主机和端口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);
}
}
}
}
最佳答案
您的软件并非旨在处理客户端与客户端之间的通信。
为此,您必须:
将客户端处理程序存储在服务器上(不将其丢弃;使用诸如LinkedList之类的动态内容)
向处理程序添加一个方法,该方法允许向该处理程序表示的客户端发送任意消息
在处理程序中接收客户端消息
将它们传递给服务器
使用发送方法将消息发送到列表中的客户端
我有点像1999年“我只能给你看门。你是必须走过的门。”但是SO似乎今天看到了不同。所以我们开始。
服务器:
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();
LinkedList<Handler> handlers = new LinkedList<Handler>();
public static void main(String[] args) {
new Server();
}
public void sendmessagetoall(String message)
{
for(Handler current : handlers)
{
try
{
current.writeMessage(message);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
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) {
Handler noob = new Handler(serverSocket.accept(),this);
handlers.add(noob);
noob.start();
}
} finally {
serverSocket.close();
}
}
catch(IOException ex) {
System.err.println(ex);
}
}
public static class Handler extends Thread{
Socket socket;
Server parent;
DataInputStream inputFromClient;
DataOutputStream outputToClient;
public Handler(Socket socket, Server parent){
this.socket = socket;
this.parent = parent;
}
public void writeMessage(String message) throws IOException
{
outputToClient.writeUTF(message);
}
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
//writeMessage(message);
parent.sendmessagetoall(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());
new Thread(new Runnable(){
@Override
public void run()
{
while(true)
{
String serverMessage = "";
try
{
serverMessage = fromServer.readUTF();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
jta.append("Word received from the server is "
+ serverMessage + '\n');
}
}})
.start();
}
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
System.out.println("from server");
// Display to the text area
jta.append("Word is " + message + "\n");
toServer.flush();
}
catch (IOException ex) {
System.err.println(ex);
}
}
}
}
快速而肮脏地编辑您的代码。
这不能处理断开连接并向所有客户端分发消息的客户端,但是您应该有一个起点。