package tcp;
/*
* ServerSocket类
* java.net包中的ServerSocket类用于表示服务器套接字,其主要功能时等待来自网络的请求。
* 它可以通过指定的端口来等待连接的套接字。
* 服务器套接字一次可以与一个套接字连接。
* 如果多台客户机同时提出连接请求,服务器套接字将请求链接的客户机存入队列中,然后从中取出一个套接字,
* 与服务器新建的套接字连接起来。
* 若请求连接数大于最大容纳数,则多出的连接请求被拒绝。
* 队列的默认大小是 50 。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 本实例是一个TCP服务器端程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息
*/
public class MyTcp {
//创建BufferedReader对象
private BufferedReader reader;
//创建ServletSocket对象
private ServerSocket server;
//创建Socket对象socket
private Socket socket;
void getServer() {
try {
//实例化Socket对象
server = new ServerSocket(8080);
//输出信息
System.out.println("服务器套接字已经创建成功");
//如果套接字是连接状态
while (true) {
//输出信息
System.out.println("等待客户机的连接");
/*
* 实例化Socket对象
* accept():等待客户机的连接,若连接,则创建一套接字
* accept()会堵塞线程的继续执行,直到接收到客户的呼叫。
* 如果没有客户呼叫服务器,那么System.out.println("连接中")语句将不会执行。
*
*/
socket = server.accept();
//实例化BufferedReader对象
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getClientMessage();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getClientMessage() {
//如果套接字是连接状态
while(true) {
//获得客户端信息
try {
System.out.println("客户机:"+reader.readLine());
} catch (IOException e) {
e.printStackTrace();//输出异常信息
}
try {
if(reader!=null) {
reader.close();//关闭流
}
if(socket!=null) {
socket.close();//关闭套接字
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new MyTcp().getServer();//创建本类对象并调用getServer()方法
}
/*
* ServerSocket类
* java.net包中的ServerSocket类用于表示服务器套接字,其主要功能时等待来自网络的请求。
* 它可以通过指定的端口来等待连接的套接字。
* 服务器套接字一次可以与一个套接字连接。
* 如果多台客户机同时提出连接请求,服务器套接字将请求链接的客户机存入队列中,然后从中取出一个套接字,
* 与服务器新建的套接字连接起来。
* 若请求连接数大于最大容纳数,则多出的连接请求被拒绝。
* 队列的默认大小是 50 。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 本实例是一个TCP服务器端程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息
*/
public class MyTcp {
//创建BufferedReader对象
private BufferedReader reader;
//创建ServletSocket对象
private ServerSocket server;
//创建Socket对象socket
private Socket socket;
void getServer() {
try {
//实例化Socket对象
server = new ServerSocket(8080);
//输出信息
System.out.println("服务器套接字已经创建成功");
//如果套接字是连接状态
while (true) {
//输出信息
System.out.println("等待客户机的连接");
/*
* 实例化Socket对象
* accept():等待客户机的连接,若连接,则创建一套接字
* accept()会堵塞线程的继续执行,直到接收到客户的呼叫。
* 如果没有客户呼叫服务器,那么System.out.println("连接中")语句将不会执行。
*
*/
socket = server.accept();
//实例化BufferedReader对象
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getClientMessage();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getClientMessage() {
//如果套接字是连接状态
while(true) {
//获得客户端信息
try {
System.out.println("客户机:"+reader.readLine());
} catch (IOException e) {
e.printStackTrace();//输出异常信息
}
try {
if(reader!=null) {
reader.close();//关闭流
}
if(socket!=null) {
socket.close();//关闭套接字
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new MyTcp().getServer();//创建本类对象并调用getServer()方法
}
}
运行结果
服务器套接字已经创建成功
等待客户机的连接