TCP编程
网络模型:传输层:1.TCP 2.UDP
【TCP简介】
TCP:Transmission Control Protocol
传输控制协议,是一种面向连接、可靠的、给予字节流传输
的传输层通信协议;
【特点】
<1>面向连接;
<2>可靠的传输 安全传输;
<3>基于字节流
;
<4>传输大小没有限制
;
【java实现TCP】Socket
:套接字 实现通信的端点 用于描述IP和端口号,是一个通信的句柄。网络通信指的就是Socket之间的通信;
常用的:
①构造函数:
<1>无参构造 Socket()
<2>有参构造 Socekt(InetAddress address,int port) 【参数:IP地址,端口】
②常用方法
<1>获取内容,可以接受其他发来的内容 输入流->读取
getInputStream();
<2>写出内容,可以向其他发送消息内容 输出流-> 写出getOutputStream();
<3>连接服务器 连接到服务器上;connect();
<4>关闭服务器close();
ServerSocekt:服务端套接字 主要用于TCP的服务端
常用的:
①构造函数:创建实例,指定服务端端口号;
<1>ServerSocket(int port)
②监听客户端的连接 如果没有连接,程序就堵塞在这,等待连接 返回值就是套接字;
<1>accept()
③关闭
<1>close()
TCP开发步骤
①开发服务端
<1>创建ServerSocket实例,并指定端口号
<2>监听客户端的连接
<3>消息交互
<4>关闭 流、套接字、服务端套接字
class Panda{
//TCP 服务端
public static void main(String[] args) throws IOException {
//创建服务端实例对象,指定【端口号】
ServerSocket serverSocket = new ServerSocket(8888);
//实现客户端连接的监听
Socket client = serverSocket.accept();
System.out.println("客户端连接...");
//消息交互 发送消息
client.getOutputStream().write("郑州欢迎你".getBytes());
//关闭
client.close();
serverSocket.close();
}
}
②开发客户端
<1>实例化套接字对象,并指定服务端的IP和端口号;
<2>信息交互
<3>关闭、销毁
class Demo{
public static void main(String[] args) throws IOException {
//TCP 客户端
//1.实例化套接字对象,并完成服务端的连接
//两个参数分别是 IP地址与端口
//InetAddress.getLocalHost() 本地IP地址
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
//消息交互
//接收消息 获取输入流
InputStream is = socket.getInputStream();
byte[] data = new byte[512];
//获取输入流的长度
int length = is.read(data);
//将输入流转为String
System.out.println("客户端:接收服务端的消息:"+new String(data,0,length));
//关闭 销毁
is.close();
socket.close();
}
}
【功能实例】
基于TCP实现一对一任意聊天
需求:实现一对一的聊天 实现发送和接收 一问一答式
class TalkServer{
//服务端
public static void main(String[] args) throws IOException {
//实例化
ServerSocket serverSocket = new ServerSocket(10888);
System.out.println("A在线....");
//监听客户端连接
Socket socket = serverSocket.accept();
//信息交互
//获取对应的输入流和输出流 用户信息的获取和发送
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//发送默认消息
outputStream.write("hello".getBytes());
//接收消息的数组
byte[] data = new byte[1024];
int len;
//键盘录入
Scanner scanner = new Scanner(System.in);
//循环 聊天
while (true){
System.out.println("请输入聊天内容:");
String message = scanner.nextLine();
outputStream.write(message.getBytes());
len = inputStream.read(data);
System.out.println("内容:"+new String(data,0,len));
}
}
}
class TaleClient{
//客户端
public static void main(String[] args) throws IOException {
//实例化客户端对象
Socket socket = new Socket(InetAddress.getLocalHost(),10888);
//信息交互
//获取对应的输入流和输出流 用户信息的获取和发送
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//接收消息的数组
byte[] data = new byte[1024];
int len;
//键盘录入
Scanner scanner = new Scanner(System.in);
//循环 聊天
while(true){
len = inputStream.read(data);
System.out.println("小花:"+new String(data,0,len));
System.out.println("请输入聊天内容:");
String message = scanner.nextLine();
outputStream.write(message.getBytes());
}
}
}
升级迭代,改进版本实现一问一答,实现一对一任意聊天;
class TalkServer{
//服务端
public static void main(String[] args) throws IOException {
//实例化
ServerSocket serverSocket = new ServerSocket(10888);
System.out.println("服务端聊天");
//监听客户端连结
Socket socket = serverSocket.accept();
//信息交互
//引入线程 实现异步通信 2个线程 一个负责 接收消息,一个负责发送消息
//发送线程
Thread sendThread = new Thread(new Runnable() {
@Override
public void run() {
OutputStream outputStream;
try {
//创建字节输出流 用来发送消息
outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());
//键盘录入
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入聊天内容:");
String message = scanner.nextLine();
outputStream.write(message.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
//启动线程
sendThread.start();
//接收线程 用于消息的接收
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//获取对应的输入流和输出流 用户信息的获取和发送
InputStream inputStream;
try {
inputStream = socket.getInputStream();
//准备接受消息的数组
byte[] data = new byte[1024];
int len;
while(true){
len = inputStream.read(data);
System.out.println("服务端:"+new String(data,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
class TaleClient{
//客户端
public static void main(String[] args) throws IOException {
//实例化客户端对象
Socket socket = new Socket(InetAddress.getLocalHost(),10888);
System.out.println("客户端");
//信息交互
//引入线程 实现任意聊天
//接收线程 用于消息的接收
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//获取对应的输入流和输出流 用户信息的获取和发送
InputStream inputStream;
try {
inputStream = socket.getInputStream();
//主备接受消息的数组
byte[] data = new byte[1024];
int len;
while (true){
len = inputStream.read(data);
System.out.println("客户端:"+new String(data,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
//发送线程 实现消息的发送
Thread sendThread = new Thread(new Runnable() {
@Override
public void run() {
OutputStream outputStream;
try {
outputStream = socket.getOutputStream();
//键盘录入
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入聊天内容:");
String message = scanner.nextLine();
outputStream.write(message.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
sendThread.start();
}
}