Socket 服务器端

           在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();
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值