java实现tcp服务器(单线程、多线程)、客户端

全栈工程师开发手册 (作者:栾鹏)

java教程全解

java实现tcp服务器(单线程、多线程)、客户端。

服务器端接收客户申请,响应时间戳和用户源字符串。

客户端使用控制台作为输入输出流

tcp服务器端代码

package com.lp.app.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

//tcp服务器,单线程和多线程
public class TCPServer{

    public static void main(String[] args) {
        moreserver(1234);
    }

    //读取输入文本,返回响应文本(二级制,对象)
    public static void  server(int port) {
        try {
            //创建一个serversocket
            ServerSocket mysocket=new ServerSocket(port);
            //等待监听是否有客户端连接
            Socket sk = mysocket.accept();
            //接收文本信息
            BufferedReader in =new BufferedReader(new InputStreamReader(sk.getInputStream()));
            String data =in.readLine();
            System.out.println("客户端消息:"+data);

//          //接收二进制字节流
//          DataInputStream dis =new DataInputStream(new BufferedInputStream(sk.getInputStream()));
//          byte[] enter =new byte[dis.available()];
//          dis.read(enter);
//          
//          //接收对象信息
//          ObjectInput ois =new ObjectInputStream(new BufferedInputStream(sk.getInputStream()));
//          Object object=ois.readObject();

            //输出文本
            PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
            out.println(new Date().toString()+":"+data);   //服务器返回时间和客户发送来的消息
            out.close();

//          //输出二进制
//          DataOutputStream dos=new DataOutputStream(sk.getOutputStream());
//          byte[] back="luanpeng".getBytes();
//          dos.write(back);
//          
//          //输出对象
//          ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());
//          oos.writeObject(new Date());  //返回一个时间对象
//          oos.close();

        } catch (Exception e) {
            // TODO: handle exception
        }

    }



    //多线程服务器
    public static void moreserver(int port){
        try {
            System.out.println("服务器启动...............");
            ServerSocket server=new ServerSocket(port);
            while(true)
            {
                //阻塞,直到有客户连接
                Socket sk=server.accept();
                //启动服务线程
                new ServerThread(sk).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}


//使用线程为多个客户端服务
class ServerThread extends Thread
{
    private Socket sk;
    ServerThread(Socket sk)
    {
        this.sk=sk;
    }
    //线程运行实体
    public void run() {
        BufferedReader in=null;
        PrintWriter out=null;
        try {
            InputStreamReader isr;
            isr=new InputStreamReader(sk.getInputStream());
            in=new BufferedReader(isr);
            out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
            while(true)
            {
                //接收来自客户端的请求,根据不同的命令返回不同的信息
                String cmd=in.readLine();
                System.out.println(cmd);
                if (cmd==null) {
                    break;
                }
                out.println(new Date().toString()+":"+cmd);   //服务器返回时间和客户发送来的消息
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            try {
                if (in!=null) {
                    in.close();
                }
                if (out!=null) {
                    out.close();
                }
                if (sk!=null) {
                    sk.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

tcp客户端代码

package com.lp.app.net;

import java.io.*;
import java.net.*;

//客户端
public class TCPClient {

    public static void main(String [] args) throws IOException {
        connect("192.168.8.102", 1234);
    }

    //远程连接
    public static void connect(String host,int port){
        try {
            System.out.println("客户端启动...............");
            Socket sock = new Socket(host, port);
            // 创建一个写线程
            new TelnetWriter(sock.getOutputStream()).start();
            // 创建一个读线程
            new TelnetReader(sock.getInputStream()).start();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}

//从控制台读取用户输入命令   线程类
class TelnetWriter extends Thread {
    private PrintStream out;

    public TelnetWriter(OutputStream out) {
        this.out = new PrintStream(out);
    }
    public void run() {
        try {
            // 包装控制台输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            // 反复将控制台输入写到Telnet服务程序
            while (true)  
                out.println(in.readLine());
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}

//将响应数据打印到控制台   线程类
class TelnetReader extends Thread {
    private InputStreamReader in;

    public TelnetReader(InputStream in) {
        this.in = new InputStreamReader(in);
    }
    public void run() {
        try {
            // 反复将Telnet服务程序的反馈信息显示在控制台屏幕上
            while (true) {
                // 从Telnet服务程序读取数据
                int b = in.read();
                if (b == -1)  
                    System.exit(0);
                // 将数据显示在控制台屏幕上
                System.out.print((char) b);
            }
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}

你可能感兴趣的:(java,java开发手册)