Thread t = new Thread(r); t.start(); DatagramSocket ds = null; try { ds = new DatagramSocket(); while (true) { String line = scan.nextLine(); if (null != line) { line = port + ":" + line; DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("localhost"), 9901); try { ds.send(dp); } catch (IOException e) { e.printStackTrace(); } } else { continue; } } }catch( SocketException e) { e.printStackTrace(); }catch( UnknownHostException e1) { e1.printStackTrace(); }finally { if (null != ds) { } } }; } }
时间: 2024-02-10 19:22:10 浏览: 22
这段代码是一个简单的UDP聊天客户端的实现。首先通过Scanner获取用户输入的监听端口,然后创建一个线程用于接收来自服务器的消息。在该线程中,通过DatagramSocket监听指定的端口,不断接收来自服务器的消息,并将其打印出来。接着,在主线程中,也创建一个DatagramSocket,用于向服务器发送消息。主线程通过Scanner获取用户输入的消息,构造一个DatagramPacket对象,将其发送给服务器。其中,InetAddress.getByName("localhost")指定了服务器地址为本地主机,端口号为9901,可以根据实际情况进行修改。整个程序通过循环实现了不断的消息收发。
相关问题
import java.io. *; import java.net.*; import java.util. *; public class EchoServer{ public static void main(String[] args) throws IOException {new EchoServerThread().start();}} class EchoServerThread extends Thread{ protected DatagramSocket socket = null; protected BufferedReader in = null; protected boolean hasMoreWork = true; protected int number = 0;//访问计数变量 public EchoServerThread() throws IOException{ this("EchoServerThread"); } public EchoServerThread(String name) throws IOException{ super(name); socket = new DatagramSocket(4248); public void run(){ while (hasMoreWork) { try{ byte[] buf = new byte[256];//接收应答 DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); //创建应答 String dString = null; number++; dString ="Hi!你是第"+ number + "个访问者!"; buf = dString.getBytes();//将应答发送给端口和地址为"address""port"的客户 InetAddress address = packet.getAddress(); int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet); }catch (IOException e){ e.printStackTrace(); hasMoreWork = false; } } socket.close();} } }哪里出错了
代码中有几个语法错误:
1. 在 EchoServerThread 构造函数中没有关闭构造函数的大括号。
2. run() 函数中没有关闭while循环的大括号。
3. 在 run() 函数中,未在 EchoServerThread 类之前添加 public 关键字。
下面是修改后的代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoServer {
public static void main(String[] args) throws IOException {
new EchoServerThread().start();
}
}
class EchoServerThread extends Thread {
protected DatagramSocket socket = null;
protected BufferedReader in = null;
protected boolean hasMoreWork = true;
protected int number = 0; // 访问计数变量
public EchoServerThread() throws IOException {
this("EchoServerThread");
}
public EchoServerThread(String name) throws IOException {
super(name);
socket = new DatagramSocket(4248);
}
public void run() {
while (hasMoreWork) {
try {
byte[] buf = new byte[256]; // 接收应答
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); // 创建应答
String dString = null;
number++;
dString = "Hi!你是第" + number + "个访问者!";
buf = dString.getBytes(); // 将应答发送给端口和地址为"address" "port"的客户
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
hasMoreWork = false;
}
}
socket.close();
}
}
```
将下列数据包通讯程序代码完善,使得可以实现两个客户端之间互相传递信息package ChattingApp; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; @SuppressWarnings("serial") public class ChattingApp extends JFrame implements ActionListener { private JTextArea chatHistory; private JTextField chatInput; private JButton sendBtn, clearBtn, exitBtn; // 发送,清空,退出按钮 private DatagramSocket socket; private InetAddress address; private int port; public ChattingApp() { setTitle("Chat Application"); setSize(500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); chatHistory = new JTextArea(20, 40); chatHistory.setEditable(false); JScrollPane scrollPane = new JScrollPane(chatHistory); chatInput = new JTextField(30); sendBtn = new JButton("发送"); sendBtn.addActionListener(this); clearBtn = new JButton("清空"); clearBtn.addActionListener(this); exitBtn = new JButton("退出"); exitBtn.addActionListener(this); JPanel panel = new JPanel(); panel.add(chatInput); panel.add(sendBtn); panel.add(clearBtn); panel.add(exitBtn); add(scrollPane, BorderLayout.CENTER); add(panel, BorderLayout.SOUTH); setVisible(true); try { socket = new DatagramSocket(); address = InetAddress.getByName("localhost"); port = 9999; } catch (Exception e) { e.printStackTrace(); } new Thread(new ReceiveThread()).start(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == sendBtn) { String message = chatInput.getText(); if (!message.isEmpty()) { byte[] data = message.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, address, port); try { socket.send(packet); } catch (Exception ex) { ex.printStackTrace(); } chatInput.setText(""); } } if (e.getSource() == clearBtn) { chatInput.setText(""); } if (e.getSource() == exitBtn) { System.exit(0); } } private class ReceiveThread implements Runnable { public void run() { try { byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true) { socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); chatHistory.append(message + "\n"); } } catch (Exception e) { e.printStackTrace(); } } } }
在该代码基础上,需要新建一个类Client并实现客户端之间的通讯。具体代码实现如下:
package ChattingApp;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
@SuppressWarnings("serial")
public class ChattingApp extends JFrame implements ActionListener {
private JTextArea chatHistory;
private JTextField chatInput;
private JButton sendBtn, clearBtn, exitBtn;// 发送,清空,退出按钮
private DatagramSocket socket;
private InetAddress address;
private int port;
public ChattingApp() {
setTitle("Chat Application");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chatHistory = new JTextArea(20, 40);
chatHistory.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatHistory);
chatInput = new JTextField(30);
sendBtn = new JButton("发送");
sendBtn.addActionListener(this);
clearBtn = new JButton("清空");
clearBtn.addActionListener(this);
exitBtn = new JButton("退出");
exitBtn.addActionListener(this);
JPanel panel = new JPanel();
panel.add(chatInput);
panel.add(sendBtn);
panel.add(clearBtn);
panel.add(exitBtn);
add(scrollPane, BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH);
setVisible(true);
try {
socket = new DatagramSocket();
address = InetAddress.getByName("localhost");
port = 9999;
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new ReceiveThread()).start();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sendBtn) {
String message = chatInput.getText();
if (!message.isEmpty()) {
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
try {
socket.send(packet);
} catch (Exception ex) {
ex.printStackTrace();
}
chatInput.setText("");
}
}
if (e.getSource() == clearBtn) {
chatInput.setText("");
}
if (e.getSource() == exitBtn) {
System.exit(0);
}
}
private class ReceiveThread implements Runnable {
public void run() {
try {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
chatHistory.append(message + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ChattingApp serverApp = new ChattingApp();
Client client1 = new Client("Client 1", "localhost", 9999);
Client client2 = new Client("Client 2", "localhost", 9999);
}
}
class Client extends JFrame implements ActionListener {
private JTextArea chatHistory;
private JTextField chatInput;
private JButton sendBtn, clearBtn, exitBtn;
private DatagramSocket socket;
private InetAddress address;
private int port;
private String name;
public Client(String name, String address, int port) {
this.name = name;
setTitle(name);
setSize(500, 500);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
chatHistory = new JTextArea(20, 40);
chatHistory.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatHistory);
chatInput = new JTextField(30);
sendBtn = new JButton("发送");
sendBtn.addActionListener(this);
clearBtn = new JButton("清空");
clearBtn.addActionListener(this);
exitBtn = new JButton("退出");
exitBtn.addActionListener(this);
JPanel panel = new JPanel();
panel.add(chatInput);
panel.add(sendBtn);
panel.add(clearBtn);
panel.add(exitBtn);
add(scrollPane, BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH);
setVisible(true);
try {
socket = new DatagramSocket();
this.address = InetAddress.getByName(address);
this.port = port;
} catch (Exception e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sendBtn) {
String message = chatInput.getText();
if (!message.isEmpty()) {
message = "[" + name + "]: " + message;
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
try {
socket.send(packet);
} catch (Exception ex) {
ex.printStackTrace();
}
chatInput.setText("");
chatHistory.append(message + "\n");
}
}
if (e.getSource() == clearBtn) {
chatInput.setText("");
}
if (e.getSource() == exitBtn) {
dispose();
}
}
}