TCP协议是面向连接的、可靠的、有序的,以字节流方式发送数据的。
步骤实现:
1创建ServerSocket和Socket
2.代开链接到的Socket的输入/输出流
3.按照协议对Socket进行读写操作
4.关闭输入输出流,关闭Socket
基于TCP协议的Socket通信需要的是客户端和服务器端的相互的通信,所以服务器端应该建立ServerSkocket;
服务器端的实现过程如下:
1.创建ServerSocket对象,绑定监听端口
2.通过accept()方法监听客户端的请求
3.连接建立后,通过输入流读取客户端发送的请求信息
4.同过输出流向客户端发送响应信息
5.关闭相关资源
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
//基于TCP协议的Socket通信
public class SeverTest {
public static void main(String[] args){
//创建一个服务器端的Socket,即ServerSocket指定绑定的
//端口
try {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket=null;
//记录客户端数量
int count=0;
//2.调用accept()方法开始监听,等待客户端连接
System.out.println("****服务器即将启动****");
while(true){
socket=serverSocket.accept();
//通过当前线程,实现
ServerThread serverthread = new ServerThread(socket);
//启动线程
serverthread.start();
count++;
System.out.println("当前客户端数量:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
为了能够实现多个客户同时访问服务端,结合多线程来进行设计:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket){
this.socket=socket;
}
//线程执行的操作,响应客户端的请求
public void run(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
//3.获取一个输入流,用来读取客户端锁发送的登陆信息
is = socket.getInputStream();
//将字节输入流包装成字节输入流
isr = new InputStreamReader(is);
//添加缓冲
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
System.out.println("我是服务器,服务器说:"+info);
}
//关闭输入流
socket.shutdownInput();
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(pw!=null)
pw.close();
if(os!=null)
try {
os.close();
} catch (IOException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
if(br!=null)
try {
br.close();
} catch (IOException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
if(is!=null)
try {
is.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(socket!=null)
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
客户端的设计:
package com.imooc.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientTest {
public static void main(String[] args){
//创建客户端的Socket,指定服务器的地址和端口号
try {
Socket socket = new Socket("localhost",8888);
//获取输出流,向服务器端发送消息
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("用户名:admin;密码:123");
pw.flush();
//关闭socket的资源
socket.shutdownOutput();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader( new InputStreamReader(is));
String info = null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务器说:"+info);
}
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
启动服务器端控制台结果为:
客户端启动控制台输出结果为:
这里是服务器端做出的响应
服务器端做出了反映:
验证得到客户端发送的数据已经到达服务器端。这样就实现了基于Socket的TCP协议的通信过程。