socket通信之客户端与服务端通信


  服务器端通过ServerSocket实例监听指定的端口,客户端新建Socket实例,通过ip地址+端口号连接到指定的服务器,服务器端通过accept()方法与客户端建立起socket通信。

下面是简单的socket通信源码(客户端发消息,服务器端接收消息):

服务器端:

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/9 14:02
 * 类描述-Description:
 *      服务器端需同时处理ServerSocket实例和Socket实例
 *      服务端监听一个端口,等待连接的到来。
 */
public class TCPserver0
{
    private static final int port=55666;//指定监听的端口
    public static void main(String[] args) throws IOException
    {
        ServerSocket server=new ServerSocket(port);//ServerSocket实例监听TCP连接请求
        Socket socket=server.accept();//为每个请求创建新的Socket实例
        DataInputStream in=new DataInputStream(socket.getInputStream());//获得输入流
        System.out.println(in.readUTF());//显示消息
    }
}

客户端:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/9 13:51
 * 类描述-Description:
 *      客户端通过ip+端口,连接到指定的server
 */
public class TCPclient0
{
    private static final String host="localhost";//或者是127.0.0.1
    private static final int port=55666;//服务器开放的端口

    public static void main(String[] args) throws IOException
    {
        Socket client = new Socket(host,port);//与服务器建立连接
        DataOutputStream out=new DataOutputStream(client.getOutputStream());//获得输出流
        String message=new BufferedReader(new InputStreamReader(System.in)).readLine();
        out.writeUTF(message);//发送输入的信息
    }
}

 

  上面的代码只实现了简单的客服端向服务器发消息,如何实现客服端与服务器能一直收发消息呢?由于发消息的同时也可以收消息,所以一个进程无法满足要求,就需要引入线程,发消息和收消息用不同的线程来处理。

下面是简单的客服端与服务器端互相收发消息的socket通信源码:

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/14 13:53
 * 类描述-Description:
 */
public class ReadThread implements Runnable
{
    private DataInputStream in;
    private String message;
    public ReadThread(Socket socket) throws IOException
    {
        in=new DataInputStream(socket.getInputStream());
    }
    @Override
    public void run()
    {
        while (true)
        {
            try
            {
                message=in.readUTF();
                System.out.println(message);
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
读线程
import java.io.*;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/14 13:56
 * 类描述-Description:
 */
public class WriteThread implements Runnable
{
    private DataOutputStream out;
    private String message;
    public WriteThread(Socket socket) throws IOException
    {
        out=new DataOutputStream(socket.getOutputStream());
    }
    @Override
    public void run()
    {
        while (true)
        {
            try
            {
                message=new BufferedReader(new InputStreamReader(System.in)).readLine();
                out.writeUTF(message);//发送输入的信息
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
写线程

服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/9 15:43
 * 类描述-Description:服务器一直接收55666的端口号消息
 */
public class TCPserver1
{
    private static final int port=55666;//指定监听的本地端口
    private ServerSocket server;
    private Socket client;
    public TCPserver1() throws IOException
    {
        server=new ServerSocket(port);
        while (true)
        {
            client=server.accept();
            System.out.println(client.getRemoteSocketAddress()+"连接到服务器!");
            Thread write=new Thread(new WriteThread(client));
            write.start();
            Thread read=new Thread(new ReadThread(client));
            read.start();
        }
    }
    public static void main(String[] args) throws IOException
    {
        new TCPserver1();
    }
}

客户端:

import java.io.*;
import java.net.Socket;
/**
 * Author:Z&J
 * E-mail: 320647879@qq.com
 * 版本:1.0
 * 创建日期:2019/11/9 15:52
 * 类描述-Description:客户端能一直发消息
 */
public class TCPclient1
{
    private static final String host="localhost";//要连接的服务器的地址,这里是本地连接,也可以是127.0.0.1
    private static final int port=55666;//服务器开放的端口
    private Socket client;
    public TCPclient1() throws IOException
    {
        client=new Socket(host,port);
        System.out.println("连接到:"+client.getRemoteSocketAddress()+" 服务器");
        Thread write=new Thread(new WriteThread(client));
        write.start();
        Thread read=new Thread(new ReadThread(client));
        read.start();
    }
    public static void main(String[] args) throws IOException
    {
        new TCPclient1();
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM