JDK 1.8
一,TCP通讯
创建TCPserver,数据接收方
/**
* TCP server demo
*/
public class TcpServer {
public static void main(String[] args) throws IOException {
//创建ServerSocket
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("TCP服务器已经启动,端口为:8888");
while (true) {
//如果有客户端请求,就分配一个socket
Socket socket = serverSocket.accept();
//创建缓冲区,构造一个BufferedReader对象
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String buffer = null;
//循环读取输入的每一行
while ((buffer = reader.readLine()) != null && !"".equals(buffer)){
System.out.println(buffer);
}
//通过socket对象得到输出流,构造BufferedWriter对象
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//创建http请求头信息
writer.write("HTTP/1.1 200 OK \r\n Content-Type:text/html \r\n charset=UTF-8\r\n\r\n");
//创建html
writer.write("<html><header><title>Http请求</title></header><body><h1>这是我用tcp创建的一个http请求</h></body></html>");
//刷新输出流,发送数据
writer.flush();
//关闭
reader.close();
writer.close();
socket.close();
}
}
}
TCPClient,发送数据
/**
* Tcp client demo
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
String msg = "Hello King and NO.13";
send(msg);
}
public static void send(String msg){
try {
//创建一个Socket,跟本机8888端口进行连接
Socket socket = new Socket("localhost", 8888);
//使用Socket创建一个PrintWriter进行写数据
PrintWriter writer = new PrintWriter(socket.getOutputStream());
//发送数据
writer.println(msg);
//刷新一下是数据立马可用
writer.flush();
//关闭
writer.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("消息发送完毕");
}
}
}
分别启动server端与client端,服务端控制台成功接收client发送的消息
TCP服务器已经启动,端口为:8888
hello NO.13
Hello King and NO.13
Hello King and NO.13
二,UDP通讯
UDP是面相无连接的,通讯时不需要对方确认的不可靠链接
创建数据接收方
/**
* Udp demo, 由于udp没有这种点对点的概念,不需要建立连接,只管发送,也不管接收是否成功,速度快
*/
public class ReceiveDemo {
public static void main(String[] args) {
try {
//创建一个DatagramSocket实例,并且把实例绑定到本机的端口地址:10007
DatagramSocket socket = new DatagramSocket(10007);
byte[] bytes = new byte[1024];
//以一个空数组来创建DatagramPacket, 这个对象的作用就是接受DatagramSocket中的数据
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
while (true) {//因为不知道数据何时来,所以这里为true
//接收到的数据包
socket.receive(packet);
//获得接受的数据
byte[] data = packet.getData();
String msg = new String(data, 0, packet.getLength());
//如果输入的为88,则结束
if(msg.equals("88")){
break;
}
//打印数
System.out.println("接收到的数据为:" + msg);
}
//关闭socket,packet无需关闭
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
数据发送方
/**
* Udp发送端
*/
public class SendDemo {
public static void main(String[] args) {
try {
//创建一个DatagramSocket对象实例
DatagramSocket datagramSocket = new DatagramSocket();
//创建一个键盘输入的BufferReader
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = reader.readLine()) != null){
//转成byte
byte[] bytes = line.getBytes();
//创建一个用于发送的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 10007);
//发送数据包
datagramSocket.send(packet);
//当接收到88时,结束发送
if("88".equals(line)){
break;
}
}
//关闭socket
datagramSocket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
分别运行后成功后,控制台输入数据,接收方成功接收数据
D:\server\Java\jdk1.8.0_11\jre\lib\plugin.jar;D:\server\Java\jdk1.8.0_11\j..
接收到的数据为:test
接收到的数据为:test
接收到的数据为:tttt
接收到的数据为:ssere
接收到的数据为:fdsafa
接收到的数据为:hello