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