多线程的 socket 编程

通过socket 实现TCP的编程

概念.socket :由ip和端口组成

首先建立ServerSocket  服务端的socket类。用户监听客户端发来的请求,因为实际应用是响应多客户端所以这里的Server循环监听等待客户端的连接

package com.socket.util;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 基于TCP协议的Socket通信,实现用户登录
 * 服务端
 * @author chenbian
 *
 */
public class Server {



public static void main(String[] args) throws IOException {


//1.创建一个服务器端Socket。即ServerSocket。指定绑定端口,并监听此端口
ServerSocket serverSocekt = new ServerSocket(6666);
//2.调用accept方法开始监听,等待客户端
System.out.println("******服务器即将启动,等待客户端的连接");
Socket socket = null;
//循环监听等待客户端的连接
//客户端连接数
int count = 0;
while(true){
socket = serverSocekt.accept();
ServerThread serverThread = new  ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端的数量为"+count);
InetAddress address =socket.getInetAddress();
System.out.println("当前客户端的ip为"+address.getHostAddress());
}

}

}




2. 建立服务端socket线程处理类

package com.socket.util;


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;


/**
 * 服务器线程处理类
 * @author chenbian
 *
 */
public class ServerThread extends Thread{
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}

@Override
public void run() {
//3.获取一个输入流 ,读取客户端发送的信息
InputStream is = null;
InputStreamReader isr= null;
BufferedReader br= null;
OutputStream os= null;
PrintWriter pw= null;
try {
is = socket.getInputStream();
//获取字节输入流
isr =new  InputStreamReader(is);//将字节流转化为字符流
br =new BufferedReader(isr);//为输入流添加缓冲区
String ifno =null;
while ((ifno= br.readLine())!=null) {
System.out.println("我服务器,客户端说"+ifno);
}
socket.shutdownInput();//关闭输入流

os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("ok");
pw.flush();


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
//5.关闭资源
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}

}




3.建立客户端socket 类

package com.socket.util;


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;
import java.net.UnknownHostException;


/**
 * 客户端
 * @author chenbian
 *
 */
public class Client {
public static void main(String[] args) throws Exception, IOException {
//1创建客户端Socket。指定服务器的端口和地址
Socket socket = new Socket("localhost",6666);
//获取输出流  ,想服务器发送信息
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//将输出流转成打印流
pw.write("用户名:admin2,密码12345");
pw.flush();
socket.shutdownOutput();

InputStream is = socket.getInputStream();


InputStreamReader isr =new  InputStreamReader(is);//将字节流转化为字符流

BufferedReader br =new BufferedReader(isr);//为输入流添加缓冲区

String ifno =null;
while ((ifno= br.readLine())!=null) {
System.out.println("我客户端,服务器说"+ifno);
}pw.close();
os.close();
socket.close();
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值