流式套接字:基于TCP协议的Socket网络编程(案例2)

本文介绍了一个基于多线程的服务器与多个客户端通信的Java实现案例,服务器能够接收并处理来自不同客户端的请求,并获取每个客户端的IP地址。

案例:在案例1的基础上实现一个服务器对应多个客户端(多线程),且获得每个客户端的IP。

线程代码:

package com.yh.mySocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;

public class LoginThread extends Thread {
    Socket socket = null;
    public LoginThread() {}
    public LoginThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            // 获得输入流,获得相应的用户请求
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info;
            while((info = br.readLine())!=null) {
                System.out.println(info);
            }
            // 获得客户端IP
            InetAddress ia = socket.getInetAddress();
            String ip = ia.getHostAddress();
            System.out.println("客户端IP地址为:"+ip);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

客户端代码(多个客户端代码类似):

package com.yh.mySocket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class LoginClient1 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        try {
            // 创建一个客户端Socket,参数为客户端IP和指定端口号,此处客户端和服务器在同一台电脑,所以IP地址相同
            socket = new Socket("localhost",5000);
            // 通过输出流,给服务器发送请求
            os = socket.getOutputStream();
            String info = "用户名:YeHuan1; 密码:12345";
            byte[] infos = info.getBytes();
            os.write(infos);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                os.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

服务器代码:

package com.yh.mySocket;

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

public class LoginServer {
    public static void main(String[] args) {
        ServerSocket serversocket = null;
        Socket socket = null;
        
        try {
            // 创建一个服务器Socket
            serversocket = new ServerSocket(5000);
            while(true) {
                // 使用accept()等待用户的通信
                socket = serversocket.accept();
                LoginThread lt = new LoginThread(socket);
                lt.start();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                // 释放资源
                socket.close();
                serversocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/YeHuan/p/10792905.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值