Socket编程实例

创建一个Server端和Client端

在客户端指定主机地址和端口。
在创建IO流的时候使用的是装饰器模式!
用户输入使用的是

BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));

客户端代码:

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

public class Client
{
    public static void main(String[] args)
    {
        final String DEFAULT_SERVER_HOST = "127.0.0.1";
        final int DEFAULT_SERVER_PORT = 8888;
        BufferedWriter writer = null;
        Socket socket = null;
        try
        {
            //        创建socket
            socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);

//            创建IO流
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//            等待用户输入信息
//            用户输入有几种方法?
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
//            用户回车就可以获得到信息了
            String input = consoleReader.readLine();

//            发送消息给服务器
            writer.write(input + "\n");
            writer.flush();

//            读取服务器返回的消息
            String msg = reader.readLine();
            System.out.println(msg);

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (writer != null)
            {
                try
                {
                    writer.close();
                    System.out.println("关闭客户端socket");
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

在服务器端指定监听的端口
服务器端代码:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{
    public static void main(String[] args)
    {
        final int DEFAULT_PORT = 8888;
        ServerSocket serverSocket = null;

//        绑定监听端口
        try
        {
            serverSocket = new ServerSocket(DEFAULT_PORT);
            System.out.println("启动服务器,监听端口" + DEFAULT_PORT);

            while (true)
            {
//                等待客户端连接
                Socket socket = serverSocket.accept();
                System.out.println("客户端" + socket.getPort() + "已经连接");
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//                读取客户端发送的消息
                String msg = reader.readLine();
                if (msg != null)
                {
                    System.out.println("客户端" + socket.getPort() + "\t" + msg);
//                    回复客户端
                    writer.write("服务器:" + msg + "\n");
//                    将缓冲区数据全部发送出去
                    writer.flush();
                }
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (serverSocket != null)
            {
                try
                {
                    serverSocket.close();
                    System.out.println("关闭服务器端的socket");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}
             				   writer.flush();//表示清空缓冲区

运行:
首先启动服务器端

启动服务器,监听端口8888

然后在启动客户端,在控制台输入hello
客户端控制台:

hello
服务器:hello
关闭客户端socket

服务器端控制台

启动服务器,监听端口8888
客户端52317已经连接
客户端52317	hello

改进的可持续读写输出的Server和Client

NewServer:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class NewServer
{
    public static void main(String[] args)
    {
        final String QUIT = "quit";
        final int DEFAULT_PORT = 8888;
        ServerSocket serverSocket = null;

//        绑定监听端口
        try
        {
            serverSocket = new ServerSocket(DEFAULT_PORT);
            System.out.println("启动服务器,监听端口" + DEFAULT_PORT);

            while (true)
            {
//                等待客户端连接
                Socket socket = serverSocket.accept();
                System.out.println("客户端" + socket.getPort() + "已经连接");
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String msg = null;
                while ((msg = reader.readLine()) != null)
                {

                    System.out.println("客户端" + socket.getPort() + "\t" + msg);
//                    回复客户端
                    writer.write("服务器:" + msg + "\n");
                    writer.flush();
//                    查看客户端是否退出
                    if (QUIT.equals(msg))
                    {
                        System.out.println("客户端" + socket.getPort() + "断开连接");
                        break;
                    }
                }
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (serverSocket != null)
            {
                try
                {
                    serverSocket.close();
                    System.out.println("关闭服务器端的socket");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

NewClient:

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

public class NewClient
{
    public static void main(String[] args)
    {
        final String QUIT = "quit";
        final String DEFAULT_SERVER_HOST = "127.0.0.1";
        final int DEFAULT_SERVER_PORT = 8888;
        BufferedWriter writer = null;
        Socket socket = null;
        try
        {
            //        创建socket
            socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);

//            创建IO流
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//            等待用户输入信息
//            用户输入有几种方法?
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
//            用户回车就可以获得到信息了
            while (true)
            {
                String input = consoleReader.readLine();

//            发送消息给服务器
                writer.write(input + "\n");
                writer.flush();

//            读取服务器返回的消息
                String msg = reader.readLine();
                System.out.println(msg);

//                查看用户是否退出
                if(QUIT.equals(input)){
                    break;
                }
            }

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (writer != null)
            {
                try
                {
                    writer.close();
                    System.out.println("关闭客户端socket");
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
Server控制台:

启动服务器,监听端口8888
客户端52618已经连接
客户端52618	马钊
客户端52618	123
客户端52618	quit
客户端52618断开连接

Client控制台:

马钊
服务器:马钊
123
服务器:123
quit
服务器:quit
关闭客户端socket
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值