您的位置:首页 > 理论基础 > 计算机网络

Socket-TCP-3

2015-10-31 15:14 561 查看
本次可以实现一个服务端接收多个客户端的请求,将接收客户请求的代码封装到线程类中,可以记录客户端数量及其IP地址:

服务线程类:

package jimo.love;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread {
/*
* 服务器线程处理
*/
Socket sket = null;
//构造方法
public ServerThread(Socket sket){
this.sket = sket;
}
//将接收客户端请求的操作写在线程里
@Override
public void run() {
InputStream is = null;
OutputStream os = null;
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter pw = null;
String info = null;

try {
is = sket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while(null != (info = br.readLine())){
System.out.println("这里是服务端,客户端说:"+info);
}
//关闭输入流
sket.shutdownInput();

os = sket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
//关闭输出流
sket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭资源
try {
if(null!=is){
is.close();
}
if(null!=isr){
isr.close();
}
if(null!=os){
os.close();
}
if(null!=br){
br.close();
}
if(null!=pw){
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}
}


服务端类:
package jimo.love;

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

public class Server {

public static void main(String[] args) {
/*
* 服务端
*/
try {
//建立服务器端socket,并监听此端口9000
ServerSocket ssket = new ServerSocket(9000);
System.out.println("---服务器端启动---");
Socket sket = null;
int num = 0;//客户端的数量
while(true){
//调用accept方法监听,等待客户端连接
sket = ssket.accept();
//创建一个新的线程
ServerThread st = new ServerThread(sket);
//开启线程
st.start();
//记录客户端的数量
num++;
System.out.println("当前客户数量:"+num);
//获取每个客户端的IP
InetAddress ia = sket.getInetAddress();
System.out.println("IP:"+ia.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}

}


客户端不变:
package jimo.love;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

public static void main(String[] args) {
/*
* 客户端
*/
try {
//创建客户端socket,指定服务器地址和端口,localhost代表本机地址
Socket sket = new Socket("localhost",9000);
//获取输出流,向服务器发送信息
OutputStream os = sket.getOutputStream();
//将字节输出流包装为打印输出流
PrintWriter pw = new PrintWriter(os);
pw.write("username:jimo;password:111");
//清空缓存,将消息发送
pw.flush();
//关闭socket输出流
sket.shutdownOutput();

//接收服务器的反馈
InputStream is = sket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while(null != (info = br.readLine())){
System.out.println("这里是客户端,服务器端反馈说:"+info);
}

//关闭资源
is.close();
isr.close();
br.close();
os.close();
pw.close();
sket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

}


先运行服务端:



再启动客户端:



这时服务端输出:



然后将客户端代码里的用户名和密码改一下:

pw.write("username:lonely;password:222");


再次运行客户端:

这时服务端输出:



由于都是在本地同一台机器的客户端,所以IP都是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: