在Socket编程中,发送方和接收方的两个Socket之间必须建立连接,才能够在TCP协议的基础上进行通信。一般服务器端ServerSocket先启动,等待客户端的请求。客户端Socket可以向服务器发送连接请求,得到允许后进行连接。一旦这两个Socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送和接受操作。
ServerSocket 类的对象是服务器端,实现服务器套接字。ServerSocket类主要用来监听指定端口并接受客户端发来的连接请求,也可以向客户端发送消息。
创建TCP的Socket,需要建立服务端和客户端。首先建立服务器端,给服务器分配一个端口号。服务器使用accept方法等待客户端的信号。当客户端的信号一到就打开Socket连接,从Socket中取得OutputStream 和 InputStream。 创建一个TCP服务器端程序具体有以下几个步骤。
1 创建一个服务器端对象
2 从服务器端接受客户连接请求
3 创建一个服务线程处理新的连接
4 在服务线程中,从socket中获得I/O流
5 对I/O流进行读/写操作,完成与客户的交互
6 关闭I/O流
7 关闭Socket
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
//写服务器端,对端口进行监听,接受客户端请求并未客户端服务
public class TCPServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
//服务器对端口8888进行监听,接受到客户端连接请求后,创建和启动服务线程
long count = 0;
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(8888);
System.out.println("服务器对8888端口实施监听...");
while(true)//服务器循环接受客户端的请求,为不同的客户端提供服务
{
//接受客户端的连接请求,若有连接请求则返回连接对应的Socket对象
Socket socket = serverSocket.accept();
count++;
//创建服务器线程
ServerThread serverThread = new ServerThread(socket, count);
serverThread.start();
}
}
catch(IOException e)
{
}
}
}
//定义ServerThread class, inherited by Thread class
class ServerThread extends Thread
{
//根据客户端和计数器来创建服务器线程
Socket socket;
long count;
public ServerThread(Socket socket, long c)//构造方法
{
this.count = c;
this.socket = socket;
}
public void run()
{
int timeCounter = 0;
try
{
//获取套接字的输入流
InputStream inputStream = socket.getInputStream();
//封装输入流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//封装输入流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//获取套接字的输入流
OutputStream outputStream = socket.getOutputStream();//获取套接字的输入流
//封装输出流
PrintStream printStream = new PrintStream(outputStream);
while(true)
{
timeCounter ++; //声明用来计数的变量
String string = bufferedReader.readLine();
if(string.equals("exit"))
{
//如果客户端输入的是“exit”,则关闭客户端
printStream.println("exit");
printStream.close();
break;
}
//告知客户端是第几次转换,有几个客户端,并输出转换的字符串
printStream.println("这是" + socket.toString() + "第" + timeCounter +
"次发送转换请求,现在有" + count + "个客户在线,转换后的字符串为 " + string.toUpperCase());
printStream.flush();
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}