老师,我想请教一下为什么我用UDP写出来的多线程会有BUG。内容为server端、serverthread端、client端

来源:4-3 编程实现基于 UDP 的 Socket 通信之客户端

想你的俊

2015-03-17 22:35

package demostrator;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPserver {
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(8888);
		
		byte[] data = new byte[1024];
		DatagramPacket packet = new DatagramPacket(data, data.length);
		
		System.out.println("***Server will be start!***");
		
		while (true) {
			socket.receive(packet);
			
			ServerThread thread = new ServerThread(packet,socket);
			thread.start();
		}

	}
}



package demostrator;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ServerThread extends Thread {
DatagramPacket packet = null;
DatagramSocket socket = null;
ServerThread(DatagramPacket packet,DatagramSocket socket){
this.packet = packet;
this.socket = socket;
}
public void run(){
String info = new String(packet.getData());
//output info from client
System.out.println("i am server,client say: "+info);
InetAddress clientAddress = packet.getAddress();
int port = packet.getPort();
byte[] data1= "Welcome to server!~".getBytes();
DatagramPacket packet1 = new DatagramPacket(data1, data1.length, clientAddress, port);
try {
socket.send(packet1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


package demostrator;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPclient {
	public static void main(String[] args) throws IOException {
		//get InetAddress of server
		InetAddress add = InetAddress.getByName("localhost");
		int port = 8888;
		byte[] info = "usearname:wujun; password:416471".getBytes();
		
		DatagramPacket packet = new DatagramPacket(info,info.length,add,port);
		DatagramSocket socket = new DatagramSocket();
		
		socket.send(packet);
		
		//receive server infomation
		byte[] serverMsg = new byte[1024];
		DatagramPacket packet1 = new DatagramPacket(serverMsg, 0, serverMsg.length);
		socket.receive(packet1);
		
		String strServer = new String(serverMsg);
		System.out.println("Server say:"+strServer);
		socket.close();
	}

}


写回答 关注

2回答

  • JowanXu
    2015-04-13 12:04:40

    把thread.start()改为thread.run()试试

    豌豆娃

    run方法就不是多线程了。就只是main线程的一个普通方法而已。如果下面还有一段程序,那么就必须等到run方法运行完,才能运行下面的程序。 start方法才是多线程的。和并行和main线程同时运行。如果下面还有一段程序,start线程会和下面程序并行运行的

    2015-04-14 19:48:17

    共 1 条回复 >

  • 没有马甲线的安琪拉
    2015-03-19 09:31:17

    能描述一下具体问题么

    没有马甲线的... 回复想你的俊

    断点跟踪一下,看看有没有相关信息提示?

    2015-03-24 13:42:33

    共 2 条回复 >

Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125013 学习 · 590 问题

查看课程

相似问题