注意:我已将我的机器设为服务器和客户端
这是我的完整代码:
客户端
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.lang.Thread;
class chatboxClient {
JFrame fr;
JPanel p;
JButton send;
JTextArea ta;
JRadioButton rb;
static chatboxServer cbS=new chatboxServer();
public Thread connectThread;
chatboxClient() {
fr=new JFrame("ChatBox_CLIENT");
p=new JPanel();
send=new JButton("send");
send.addActionListener(new ActionListener() { // action listener for send
public void actionPerformed(ActionEvent ae) {
sendActionPerformed(ae);
}
});
ta=new JTextArea();
ta.setRows(20);
ta.setColumns(20);
rb=new JRadioButton("Connect"); // action listener for connect
rb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
connectActionPerformed(ae);
}
});
fr.add(p);
p.add(ta);
p.add(rb);
p.add(send);
fr.setSize(500,500);
fr.setResizable(false);
fr.setVisible(true);
}
public void connectActionPerformed(ActionEvent ae) {
EnsureEventThread();
CreateConnectThread();
}
public void CreateConnectThread() { // Seperate Thread created for handling 'connect'
Runnable r=new Runnable() {
public void run() {
connect();
}
};
connectThread=new Thread(r,"Connect Thread");
connectThread.start();
}
public void connect() {
try {
cbS.Laccept();
rb.setEnabled(false);
JOptionPane.showMessageDialog(new JFrame()," Sockets InterConnected!");
} catch(Exception exc) {
JOptionPane.showMessageDialog(new JFrame()," Connection Error..");
}
}
public void sendActionPerformed(ActionEvent ae) {
try {
String s=ta.getText();
InetAddress address=InetAddress.getLocalHost();
DatagramSocket ds=new DatagramSocket(3000,address);
byte buffer[]=new byte[800];
buffer=s.getBytes();
Runnable rR=new Runnable() { // Seperate thread for 'Receive'
public void run() {
cbS.Receive(s);
}
};
Thread TReceive=new Thread(rR,"Receive Thread");
TReceive.start();
DatagramPacket dp=new DatagramPacket(buffer,buffer.length,address,3000);
if(true) {
ds.send(dp);
cbS.Receive(s); // call Receive method of chatboxServer class
}
catch(Exception exc) {
JOptionPane.showMessageDialog(new JFrame(),"Error sending Message");
}
}
}
public void EnsureEventThread() {
try {
if(SwingUtilities.isEventDispatchThread())
return;
} catch(Exception exc) {
System.out.println(exc);
}
}
public static void main(String args[]) {
chatboxClient cbC= new chatboxClient();
}
}
服务器端
import java.awt.*;
import java.net.*;
import javax.swing.*;
import java.awt.event.*;
class chatboxServer {
JFrame fr;
JPanel p;
JTextArea ta;
JButton send;
ServerSocket ss;
byte buffer[]=new byte[800];
chatboxServer() {
fr=new JFrame("ChatBox_SERVER");
p=new JPanel();
ta=new JTextArea();
ta.setRows(20);
ta.setColumns(20);
send=new JButton("send");
fr.add(p);
p.add(ta);
p.add(send);
fr.setVisible(true);
fr.setSize(500,500);
fr.setResizable(false);
}
public void Receive(String sm) {
try {
buffer=sm.getBytes();
InetAddress address=InetAddress.getLocalHost();
DatagramSocket ds=new DatagramSocket(3000,address);
DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
ds.receive(dp);
String s=new String(dp.getData(),0,dp.getLength());
ta.setText(s);
} catch(Exception exc) {
System.out.println("Error Receiving..");
}
}
public void Laccept() {
try {
ss=new ServerSocket(3000); // First making port number 3000 on server to listen
Socket s=ss.accept();
} catch(Exception exc) {
JOptionPane.showMessageDialog(new JFrame(),"Accept Failed :3000 :Server Side");
}
}
}
问题--- 点击连接时没有任何反应。有什么问题?
我检查了一件事:程序等待ss.accept(); 这就是我认为Laccept()调用旁边的语句不起作用的原因......
请注意,我通过上述代码的目的是将消息发送到服务器,该服务器与运行客户端的机器相同
请清楚说明我该怎么做?
答案 0 :(得分:0)
首先必须决定是否要使用TCP或UDP进行连接。
TCP使用Socket和ServerSocket类,并为您提供连接,您可以通过该连接发送连续的字节流(并在另一个方向上接收另一个字节)。 TCP协议确保所有数据以正确的顺序到达。
UDP使用DatagramSocket类,并发送单个包,这些包可能会或可能不会到达另一方(通常它们会这样做,但是不能保证,并且您无法确定是否未实现确认你自己)。如果他们到达某个主机/端口并且没有进程在那里收听,他们将被丢弃。
通常,混合两者都没有意义。
你的程序在一个接一个的同一个线程中使用UDP send
和receive
,这将导致接收套接字无法读取它,因为数据包已被丢弃。您必须在单独的线程中调用receive,然后才能发送包。
编辑(在您的评论之后):
这是UDP工作的方式。传入包没有队列。
ds.receive(dp);
调用等待从现在开始到达的新软件包,而不是过去某个时间发送的软件包。所以这个调用将永远阻塞(另外在事件调度线程上,意味着你没有得到任何重绘或其他事件处理)。
就像在新线程中启动connect()方法一样,也可以在新线程中启动服务器的Receive
方法。 (事实上,您的服务器的Laccept
并未用于任何事情。)
除此之外,您的两个DatagramSockets(客户端1和服务器1)绑定到同一本地端口,这也可能导致问题。不要这样做。