目前我有这种形式的 TCP 版本的套接字。
final ServerSocket serverSocketConn = new ServerSocket(9000);
while (true)
{
try
{
Socket socketConn1 = serverSocketConn.accept();
new Thread(new ConnectionHandler(socketConn1)).start();
}
catch(Exception e)
{
System.out.println("MyError:Socket Accepting has been caught in main loop."+e.toString());
e.printStackTrace(System.out);
}
}
class ConnectionHandler implements Runnable {
private Socket receivedSocketConn1;
ConnectionHandler(Socket receivedSocketConn1) {
this.receivedSocketConn1=receivedSocketConn1;
}
try{
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(receivedSocketConn1.getOutputStream()));
BufferedReader bReader = new BufferedReader(new InputStreamReader(receivedSocketConn1.getInputStream()));
}
}
它工作正常,所以我正在将其转换为 UDP。
public class commUDP9000 {
class ReceiverThread implements Runnable {
private DatagramSocket receivedSocketConn1;
ReceiverThread(DatagramSocket receivedSocketConn1) {
System.out.println("Thread Received");
this.receivedSocketConn1=receivedSocketConn1;
}
public void run(){
while (true){
try{
//
final byte[] buffer = new byte[1024];
final DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
receivedSocketConn1.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("RECEIVED: " + sentence);
}
catch(Exception e){
System.out.println("MyError:Socket Accepting has been caught in main loop."+e.toString());
e.printStackTrace(System.out);
}
}
}
}
public static void main(String[] args) {
new commUDP9000();
}
commUDP9000() {
try{
final DatagramSocket serverSocketConn = new DatagramSocket (9000);
new Thread(new ReceiverThread(serverSocketConn)).start();
}
catch (Exception e)
{
System.out.println("MyError:Socket Conn has been caught in main loop."+e.toString());
e.printStackTrace(System.out);
//System.exit(0);
}
}
}
我运行这个并最终得到
MyError:套接字接受已在主循环中捕获。java.net.BindException:地址已在使用中
最佳答案
您无法在 UDP 上创建连接,因为它是无连接的。
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
DatagramPacket packet = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
此处仅允许发送和接收。
使用 UDP,您可以做的就是向另一端发送一个数据包。如果您有数据包序列,它们将被视为单独的数据包。无法保证交货。每条消息的有效负载限制约为 64kbites。理论上,但取决于您的网络 MTU(可能是 1500 字节)。唯一的好处是速度快且开销最小。
所以你应该尽早创建足够的缓冲区。如果你想模拟流,你必须在数据报之上实现你自己的协议(protocol)。同样,面向连接的 TCP 是在无连接的 IP 协议(protocol)之上实现的。
关于Java tcp套接字转换为udp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240994/