JAVA套接字之TCP简单使用

2017 年 8 月 9 日 星期三
/ ,
8

JAVA套接字之TCP简单使用

Java套接字实现聊天室

单客户端排队与服务器建立连接

客户端程序

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

public class Client{
    static Socket server;
    public static void main(String[] args)throws Exception{
        //客户端请求与本机在5678端口建立TCP连接
        server=new Socket(InetAddress.getLocalHost(),5678);
        BufferedReader in=
            new BufferedReader(new InputStreamReader(server.getInputStream()));
        //获取Socket的输入流,用来接收从服务端发送过来的数据
        PrintWriter out=new PrintWriter(server.getOutputStream());
        //获取Socket的输出流,用来发送数据到服务端
        BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
        //从键盘输入的数据流
        while(true){
            String str=wt.readLine();//读取键盘输入字符串
            out.println(str);//发送数据到服务端
            out.flush();
            if(str.equals("end")){
                break;
            }
            System.out.println(in.readLine());//打印服务器返回的字符串
        }
        server.close();//关闭连接
    }
}

服务器程序

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

public class Server {
    public static void main(String[] args) throws IOException{
        ServerSocket server=new ServerSocket(5678);//通信端口
        while(true){//一个客户端断开连接后,等待与另一个客户端建立连接
            Socket client=server.accept();//accept用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。
。
            BufferedReader in=
                new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out=new PrintWriter(client.getOutputStream());
            while(true){//直到客户端发送end退出循环
                String str=in.readLine();
                System.out.println(str);
                out.println("has receive....");
                out.flush();
                if(str.equals("end"))
                    break;
            }
            client.close();//关闭通信
        }
    }
}

多个客户端同时与服务器建立连接

客户端程序不变,服务器端阻塞等待客户端连接,并给每个连接分配一个线程

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

public class Server extends Thread {//继承Thread类
    private Socket client;

    public Server(Socket c){//类初始化,接受参数为客户端的请求
        this.client = c;
    }

    public void run(){//重写run函数
        try{
            BufferedReader in=
                new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out=new PrintWriter(client.getOutputStream());
            while(true){
                String str=in.readLine();
                System.out.println(str);
                out.println("has receive....");
                out.flush();
                if(str.equals("end"))
                    break;
            }
            client.close();
        }catch(IOException ex){
        }finally{
        }
    }

    public static void main(String[] args) throws IOException{
        ServerSocket server=new ServerSocket(5678);
        while(true){
            Server mu=new Server(server.accept());//每当有客户端请求就新建一个Server类与之通信
            mu.start();//启动进程
        }
    }
}

评论已关闭