用Socket实现服务端和客户端,进行一对一顺序对话

一、服务端代码

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

/**
 * Description:
 * 实现一个Socket服务端
 * @author Lee
 * */

public class Server {

    /**
     * Description:
     * 实现一个Socket服务端
     * */
    public static void test1(){ 
        ServerSocket server = null;
        Socket client = null;
        PrintWriter  output  = null;
        Scanner input = null;
        Scanner keyboard = null;
        try{
            //以指定的端口创建一个Socket服务端
            server = new ServerSocket(12000);

            while(true){
                //获取一个Socket客户端实例
                client = server.accept();

                //获取客户端的IP地址,连接端口
                System.out.println("已经连接上"+client.getInetAddress()
                                        +"客户端,端口为:"+client.getPort());

                //监听客户端的输入
                input = new Scanner(client.getInputStream());
                //监听客户端的输出
                output = new PrintWriter(client.getOutputStream());
                //监听服务端的键盘输入
                keyboard = new Scanner(System.in);

                //readLine 要等待换行符才会终止,因此只有当客户端输入的字符中换行符才会结束读取完数据
                /*
                A line is considered to be terminated by any one
                of a line feed ('\n'), a carriage return ('\r'), or a carriage return
                followed immediately by a linefeed. 
                */
//              BufferedReader re = new BufferedReader(new InputStreamReader(input));               
//              String line = null;
//              while((line=re.readLine())!=null){
//                  System.out.println("client:"+line);
//              }

                //同样的Scanner当没有遇到换行符的时候,会缓存所有读取的数据,当结束程序的时候则会释放出来。
                /*
                it may buffer all of the input searching for the line to skip 
                if no line separators are present
                */

                //等待客户端的输入  
                while(input.hasNext()){
                    System.out.println("CLIENT:"+input.nextLine());

                    //读取键盘输入
                    String line = "";
                    System.out.print("SERVER:");
                    if(keyboard.hasNext()){
                        line =keyboard.nextLine();

                        //将键盘输入的内容输出给客户端
                        output.println(line);
                        output.flush();
                    }
                }   
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{

            //关闭资源
            try{
                server.close();
                client.close();
                input.close();
                output.close();
                keyboard.close();

            }catch(IOException e){
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test1();
    }

}

二、客户

import java.net.Socket;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.io.InputStream;
import java.util.Scanner;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.BufferedReader;
 * Description:
 * 实现一个Socket客户端
 * @author Lee
 * */

public class Client {

    /**
     * Description:
     * 实现一个Socket客户端
     * */
    public static void test1(){
        Socket server = null;
        PrintWriter output = null;
        Scanner input = null;
        Scanner keyboard = null;

        try{
            server = new Socket();
            //连接远程服务端   
            server.connect(new InetSocketAddress("192.168.20.59",12000));

            //获取远程服务端的IP地址和端口   
            System.out.println("已经连接上"+server.getInetAddress()
            +"服务端,端口为:"+server.getPort());

            //监听输出流
            output = new PrintWriter(server.getOutputStream());
            //监听输入流
            input = new Scanner(server.getInputStream());
            //监听键盘的输入流
            keyboard = new Scanner(System.in);

            //等待键盘输入
            System.out.print("CLIENT:");
            while(keyboard.hasNext()){
                String line = keyboard.nextLine();

                /* 源码:
                public void print(String s) {
                    if (s == null) {
                        s = "null";
                    }
                    write(s);
                }
                public void println() {
                    newLine();
                }   
                public void println(boolean x) {
                    synchronized (lock) {
                        print(x);
                        println();
                    }
                }   
                private void newLine() {
                    try {
                        synchronized (lock) {
                            ensureOpen();
                            //这里加上了换行符,因此readLine才能够完成读取
                            out.write(lineSeparator);
                            if (autoFlush)
                                out.flush();
                        }
                    }
                    catch (InterruptedIOException x) {
                        Thread.currentThread().interrupt();
                    }
                    catch (IOException x) {
                        trouble = true;
                    }
                }
                */
                //使用readLine方法的时候,是需要换行符在终止读取数据的。

                //键盘盘输入的内容输出给服务端
                output.print(line+"\n");
                //print.println(line);  
                output.flush();

                //等待服务端输入流
                if(input.hasNext())
                    System.out.println("SERVER:"+input.nextLine());

                System.out.print("CLIENT:");
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //关闭资源
            try{
                server.close();
                output.close();
                input.close();
                keyboard.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test1();
    }

}

版权声明:本文为qq1131410679原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。