我是套接字编程的新手,我试图在服务器和客户端之间建立通信,但我不知道该怎么做,我对如何去做有点困惑。我已经在下面编写了程序,但它被错误了,我无法理解为什么。
package server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) {
// TODO code application logic here
try {
DatagramSocket socket = new DatagramSocket(7000);
socket.setSoTimeout(0);
while(true)
{
byte []buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
socket.receive(packet);
String message = new String (buffer);
System.out.println(message);
String Reply ="Am here";
DatagramPacket data = new DatagramPacket(Reply.getBytes(), Reply.getBytes().length, packet.getAddress(), packet.getPort());
socket.send(data);
}
}
catch (Exception error){
error.printStackTrace();
}
}
}
客户
package client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) {
// TODO code application logic here
try{
String message = "Hello Server";
String host = "localhost";
InetAddress addr = InetAddress.getByName(host);
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, addr, 7000);
DatagramSocket socket = new DatagramSocket(4000);
socket.send(packet);
DatagramSocket sockets = new DatagramSocket(7000);
sockets.setSoTimeout(0);
while(true)
{
byte []buffer = new byte[1024];
DatagramPacket packets = new DatagramPacket(buffer,buffer.length);
sockets.receive(packets);
String messages = new String (buffer);
System.out.println(messages);
}
}
catch (Exception error){
error.printStackTrace();
}
}
}
我怎样才能让他们沟通。我听说过多线程,但无法了解它是如何工作的。
我收到以下错误。
java.net.BindException: Address already in use: Cannot bind
at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:84)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:93)
at java.net.DatagramSocket.bind(DatagramSocket.java:392)
at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
at client.Client.main(Client.java:32)
如果要使用套接字从客户端向服务器发送/接收,请在服务器端使用 ServerSocket。
然后使用接受 - 这将侦听要与此套接字建立的连接并接受它。
Accept
返回的 Socket 对象具有可以读取和写入的输入和输出流。
客户端将只使用套接字对象
有关示例,请参阅 http://cs.lmu.edu/~ray/notes/javanetexamples/
如果出于某种原因您坚持使用 DatagramSocket,请参阅此示例 https://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html
发生此错误的原因是您尝试将套接字绑定到的端口已在使用中。端口 7000
由客户端和服务器使用:
DatagramSocket sockets = new DatagramSocket(7000);