Java socket编程(单线程socket,多线程socket)

Java实现单线程socket

思路

服务端:使用ServerSocket类建立服务端对象并监听端口,使用DataInputStream类.readUTF()方法获取客户端数据输入,关闭DataInputStream,释放socket。

客户端:使用Socket类建立客户端对象并发送连接请求,使用DataOutputStream类.writeUTF()方法向服务端发送数据,关闭DataOutputStream,释放socket。

效果

客户端发送一次数据并关闭,服务端接收一次数据并关闭

服务端

客户端

客户端

服务端
代码:

package socket;

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

/**
 * Created by 15114 on 2017/6/1.
 */
public class SocketService {
    public static void main(String[] args){
        try {
            ServerSocket server = new ServerSocket(5555);//创建socket对象并监听5555端口
            System.out.println("服务器启动成功\n");
            Socket socket = server.accept();//等待客户端连接
            System.out.println("socket连接成功!等待客户端输入\n");
            DataInputStream in = new
            DataInputStream(socket.getInputStream());//创建DataInputStream对象接收数据流
            String accpet = in.readUTF();//readUTF()接收UTF-8格式输入流
            System.out.println("客户端说:"+ accpet);//输出接收到的数据
            in.close();//释放in对象
            socket.close();//关闭此socket
            server.close();//释放service对象
        } catch (Exception e) {
            System.out.println("Error:" + e);
        }
    }
}

客户端:

package socket;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by 15114 on 2017/6/1.
 */
public class SocketClient {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 5555);
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            Scanner scn = new Scanner(System.in);
            System.out.println("请输入发送给服务端的信息:");
            String send = scn.nextLine();
            out.writeUTF(send);
            System.out.println("发送成功!");
            out.close();
            socket.close();
        } catch (IOException ex) {
            System.out.println("Error:" + ex);
        }
    }
}

Java实现多线程socket

思路

大体与单线程相同,但多线程socket每次创建时需用Thread类start()方法创建一个线程对socket托管,使用循环控制实现多线程

效果

服务端

客户端1

客户端2

客户端1

客户端2

服务端

代码

服务端:

package threadsocket;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by 15114 on 2017/6/1.
 */
public class Server {

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket=new ServerSocket(8888);
            int count=0;
            System.out.println("***服务器即将启动,等待客户端的连接***");
            while(true){
                Socket socket=serverSocket.accept();
                ThreadService serverThread=new ThreadService(socket);
                count++;
                System.out.println("终端" + count +"连接成功!");
                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
                serverThread.start();//创建线程托管socket,继续循环创建新socket
            }
        } catch (IOException e) {
            System.out.println("Error:" + e);
        }
    }
}

Thread类run方法重写:

package threadsocket;

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

/**
 * Created by 15114 on 2017/6/1.
 */
public class ThreadService extends Thread{
        Socket socket = null;
        public ThreadService(Socket socket) {
            this.socket = socket;
        }
        public void run(){
            try {
                DataInputStream in = new DataInputStream(socket.getInputStream());
                String accpet = in.readUTF();
                System.out.println("终端说:" + accpet);
                in.close();
                socket.close();
            } catch (IOException e) {
                System.out.println("Error:" + e);
            }
        }
    }

客户端:

package threadsocket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
 * Created by 15114 on 2017/6/1.
 */
public class Client {

    //static private Random r = new Random();

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8888);
            System.out.println("终端 1 连接成功!\n");
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            Scanner scn = new Scanner(System.in);
            System.out.println("请输入发送给服务端的信息:");
            String send = scn.nextLine();
            out.writeUTF(send);
            System.out.println("发送成功!");
            out.close();
            socket.close();
        } catch (IOException ex) {
            System.out.println("Error:" + ex);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,可以将单线程Socket 编程转换为多线程编程。这样可以实现多个客户端同时连接服务器并进行并发处理。 下面是一个简单的示例代码,演示了如何使用多线程处理 Socket 连接: ```java import java.io.*; import java.net.*; public class MultiThreadedServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("客户端连接成功,IP:" + clientSocket.getInetAddress()); Thread clientThread = new ClientThread(clientSocket); clientThread.start(); } } static class ClientThread extends Thread { private Socket clientSocket; public ClientThread(Socket socket) { this.clientSocket = socket; } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); // 读取客户端发送的数据 String message = in.readLine(); System.out.println("接收到客户端消息:" + message); // 向客户端发送响应数据 out.println("已收到消息:" + message); // 关闭连接 clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在上述代码中,主线程通过 `ServerSocket` 监听指定端口,并在有客户端连接时创建一个新的线程 `ClientThread` 进行处理。`ClientThread` 类继承自 `Thread` 类,重写 `run` 方法,在其中进行与客户端的通信。 通过这种方式,每个客户端连接都会在独立的线程中进行处理,从而实现了多线程Socket 编程。这样可以充分利用系统资源,并提高服务器的并发处理能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值