基于UDP的Socket通信实现多线程:
/**
*服务器端
*/
package com.imooc.UDPTest;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
System.out.println("服务器端已经启动,等待客户端发送数据");
int count=0;
while (true){
socket.receive(packet);//此方法在接收到数据包之前会一直堵塞
Thread serverThread=new ServerThread(socket,packet,data);
serverThread.start();
InetAddress address=packet.getAddress();
System.out.println("当前客户端IP:"+address.getHostAddress());
count++;
System.out.println("当前客户端数量:"+count);
}
}
}/**
*服务器线程处理类
*/
package com.imooc.UDPTest;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ServerThread extends Thread{
DatagramSocket socket=null;
DatagramPacket packet=null;
byte[] data=null;
public ServerThread(DatagramSocket socket,DatagramPacket packet,byte[] data){
this.socket=socket;
this.packet=packet;
this.data=data;
}
public void run() {
String info=new String(data,0,packet.getLength());
System.out.println("我是服务器,客户端说:"+info);
InetAddress address=packet.getAddress();
int port=packet.getPort();
data="欢迎您".getBytes();
packet=new DatagramPacket(data,data.length,address,port);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
}/**
*客户端
*/
package com.imooc.UDPTest;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws IOException {
//定义服务器的地址、端口号、数据
InetAddress address=InetAddress.getByName("DESKTOP-M8K8E0E");
int port=8800;
byte[] data="用户名:admin;密码:123".getBytes();
//创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data,data.length,address,port);
//创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
socket.send(packet);
byte[] data1=new byte[1024];
DatagramPacket packet1=new DatagramPacket(data1,data1.length);
socket.receive(packet1);
String info=new String(data1,0,packet1.getLength());
System.out.println("我是客户端,服务器说:"+info);
socket.close();
}
}
基于udp多线程通信


客户端接收服务端的响应代码
服务端向客户端响应的代码
UDP客户端代码
基于UDP的Socket通信
客户端:
1.定义发送信息
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="用户名:admin;密码:123".getBytes();2.创建DatagramPacket,包含将要发送的信息
DatagramPacket packet=new DatagramPacket(data,data.length,address,port);
3.创建DatagramSocket
DatagramSocket socket=new DatagramSocket();
4.发送数据
socket.send(packet);
socket实现UDP编程
基于UDP的Socket通信之客户端
UDP客户端实现
基于UDP的多线程登陆
/**
* 服务器端,实现基于UDP的用户登录
* @author Strawberry
*
*/
public class Test006_UDPServer {
public static void main(String[] args) throws IOException {
//创建服务器DatagramSocket,并指定端口
DatagramSocket datagramSocket=new DatagramSocket(8800);
//创建数据报,用于接收客户端信息
byte[] data=new byte[1024];
int count=0;
System.out.println("***Server start, waiting data from client..***");
//开始接收客户端信息
while(true){
DatagramPacket datagramPacket=new DatagramPacket(data, data.length);
datagramSocket.receive(datagramPacket);//此方法在接收到数据报之前会一直阻塞
Test006_ServerThread serverThread=new Test006_ServerThread(datagramSocket, datagramPacket);
serverThread.start();
count++;
System.out.println("client connected:"+count);
serverThread.sendData();
}
//关闭资源
//datagramSocket.close();
}
}/**
* 线程处理类
* @author Strawberry
*
*/
public class Test006_ServerThread extends Thread{
DatagramSocket datagramSocket=null;
DatagramPacket datagramPacket=null;
public Test006_ServerThread(DatagramSocket datagramSocket,DatagramPacket datagramPacket){
this.datagramSocket=datagramSocket;
this.datagramPacket=datagramPacket;
}
public void run(){
//接收客户端信息
byte[] data=datagramPacket.getData();
String info=new String(data, 0, datagramPacket.getLength());
System.out.println("[Info from client]: "+info);
}
public void sendData(){
//响应客户端信息
try {
InetAddress address=datagramPacket.getAddress();
int port=datagramPacket.getPort();
String info2="Login Success!";
byte[] data2=info2.getBytes();
DatagramPacket datagramPacket2=new DatagramPacket(data2, data2.length, address, port);
datagramSocket.send(datagramPacket2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
基于UDP客户端实现:
//1、定义服务器的地址、端口号、数据
InetAddress address=InetAddress.getByName("localhost");
int port=8800;
byte[] data="用户名:admin;密码:123".getBytes();
//2、创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length,address,port);
//3、创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4、向服务器端发送数据报
socket.send(packet);
UDP通信 客户端接收服务器端响应的数据
UPD通信 客户端实现代码
1
2
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="欢迎您!".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();
while(true) {
Thread thread=new Thread(new UDPServerThread(socket,data));
thread.start();
try {
thread.sleep(500);
//线程的run方法中无死循环,在main方法中开启线程//并放入死循环中,若不加sleep方法,则警告线程无法正确启动
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
[2.321s][warning][os,thread] Failed to start thread - _beginthreadex failed (EACCES) for attributes: stacksize: default, flags: CREATE_SUSPENDED STACK_SIZE_PARAM_IS.
Exception in thread "main" ????????????????????????
package com.one;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServerThread implements Runnable{
private byte []data=null;
private DatagramSocket socket;
public UDPServerThread(DatagramSocket socket,byte []data) {
this.data=data;
this.socket=socket;
}
@Override
public void run() {
DatagramPacket packet=new DatagramPacket(data, 0, data.length);
try {
socket.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.打印输出客户端发送的数据
String s=new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:"+s);
/*
* 向客户端响应数据
*/
int port=packet.getPort();
InetAddress address=packet.getAddress();
byte []data2="欢迎你".getBytes();
DatagramPacket packet1=new DatagramPacket(data2, 0, data2.length, address, port);
try {
socket.send(packet1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}