网络编程二之TCP和UDP
以下代码都是先运行服务端在运行客户端
TCP简单的聊天
先创建一个tcp服务器
socket 套接字.两台计算机通信的端点.并且能指定端口号
package com.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8786);
System.out.println("服务器已就绪,等待客户端连接....");
//2.服务器监听并且接受客户端的请求,如果有请求,自动建立连接,返回客户端的套接字
Socket socket=serverSocket.accept();
System.out.println("已连接"+socket);
//3.获取客户端的消息
//3.1 获取输入流
InputStream inputStream = socket.getInputStream();
//3.2 缓冲区,每次最多读1k的数据
byte[] bytes = new byte[1024];
//3.3 读取数据
int length = inputStream.read(bytes);
//3.4 字节数组转字符串
String clientMsg = new String(bytes, 0, length);
System.out.println("客户端说:" + clientMsg);
//4.向客户端发送数据
//4.1 获取输出流
OutputStream outputStream = socket.getOutputStream();
//4.2 发送内容
byte[] bytes1 = "嗯嗯,你说的对呢".getBytes();
//发出内容
outputStream.write(bytes1);
//关闭
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Client客户端
package com.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
try {
//1.创建客户端套接字,指定服务器的ip和端口号,连接服务器
Socket socket = new Socket("127.0.0.1", 8786);
System.out.println("已连接到"+socket);
//2.向服务端发送数据
//2.1输出流
OutputStream outputStream = socket.getOutputStream();
//2.2内容
byte[] bytes="你真帅啊!哈哈哈".getBytes();
//2.3 发送内容
outputStream.write(bytes);
System.out.println("发送:你怎么穿品如的衣服!你好sao呀!");
//3.获取服务器端的数据
//3.1输入流
InputStream inputStream = socket.getInputStream();
byte[] bytes1= new byte[1024];
int length= inputStream.read(bytes1);
String serverMsg = new String(bytes1, 0, length);
System.out.println("服务器端说:"+serverMsg);
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UDP简单的聊天
聊天的内容写在程序里面了所以叫简单的聊天
DatagramPacket: 数据包,用于实现无连接数据投递
UDPServer 服务端
package com.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPServer {
public static void main(String[] args) {
//1.创建套接字
try {
DatagramSocket datagramSocket = new DatagramSocket(8181);
//2.读取数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//3.接受数据包
datagramSocket.receive(datagramPacket);
//4.获取数据包中的信息
String domain = datagramPacket.getAddress().getHostName();//域名
String ip = datagramPacket.getAddress().getHostAddress();//ip
int port = datagramPacket.getPort();//端口
int length = datagramPacket.getLength();//数据长度
//打印数据
String content = new String(bytes, 0, length);
System.out.println("接收到来自:" + ip + "的数据:" + content );
datagramSocket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UDPClicent:udp客户端
package com.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPClicent {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket();
//接收端ip
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
//设置接收端的端口号
int port=8181;
//设置发送的数据
byte[] bytes ="今天是阴天呀!没有太阳不开心!".getBytes();
//组装数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, inetAddress, port);
//发送数据包
datagramSocket.send(datagramPacket);
datagramSocket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TCP高级进阶
tcp高级进阶就是可以在客户端输入,服务端接收,然后再在服务端输入客户端接受;
TCPProClient客户端
package com.tcpPro;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPProClient {
public static void main(String[] args) {
try {
Socket socket =new Socket("127.0.0.1", 8889);
//安全判断
if (socket.isConnected()) {
System.out.println("连接到:"+socket);
}
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入:");
String content = scanner.next();
dataOutputStream.writeUTF(content);
//接受服务端发送的信息
String serverMsg = dataInputStream.readUTF();
System.out.println("服务端说:"+serverMsg);
if (serverMsg.equals("走你")) {
break;
}
}
dataInputStream.close();
dataOutputStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TCPProServer服务端代码
package com.tcpPro;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//API 官方文档
public class TCPProServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8889);
System.out.println("服务器已启动,等待客户连接....");
Socket socket = serverSocket.accept();
System.out.println("已连接:"+socket);
//DataInputStream 字节输入缓冲流
DataInputStream dataInputStream =new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream =new DataOutputStream(socket.getOutputStream());
//连续性的获取客户端的信息
Scanner scanner = new Scanner(System.in);
while (true) {
String cilentMsg = dataInputStream.readUTF();
System.out.println("客户端说:"+cilentMsg);
//向客户端发送数据
System.out.println("服务端说:");
String serverMsg = scanner.next();
dataOutputStream.writeUTF(serverMsg);
if (cilentMsg.equals("走你")) {
break;//循环结束
}
}
dataInputStream.close();
dataOutputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}