多线程Socket编程实现服务器与客户端的连接

来源:互联网 发布:王洪成水变油事件 知乎 编辑:程序博客网 时间:2024/04/29 04:47

利用TCP进行Java网络编程时,服务器端的开发步骤为:

1、创建ServerSocket,指定绑定的端口,通过ServerSocket对象的accept()方法来创建socket以实现服务器端与客户端的通信。

2、打开相关的输入输出流

3、按协议进行读写

4、关闭流和相应的socket。(对于同一个socket,如果关闭了输出流,则与该关联的socket也被关闭,而关闭socket时,相应的流会自动关闭,所以一般直接关闭socket即可。

类ServerThread

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;/* * 服务器端类ServerThread */public class ServerThread extends Thread {//和本线程相关的socketSocket socket = null;public ServerThread(Socket socket) {this.socket =socket;}//线程执行操作,响应客户端请求@Overridepublic void run() {//获取客户端提交的信息,通过输入输出流实现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 info = null;while((info=br.readLine())!= null){System.out.println("我是服务器端,客户端说:"+info);}socket.shutdownInput();//关闭输入流os = socket.getOutputStream();pw = new PrintWriter(os);pw.write("欢迎你!");pw.flush();//将缓冲输出socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();} finally{try {//对于同一个socket,如果关闭了输出流,则与该流关联的socket也会被关闭,//在这里我们直接关闭socket,对应的输入输出流也会被关闭if (socket != null)socket.close();} catch (Exception e2) {// TODO: handle exception}}}}

类Server,循环接收客户端的连接请求,一旦连接成功,就启用一个新线程

import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/* * 服务器端,每次与一个客户端连接时,会启动一个新的线程 */public class Server {public static void main(String[] args) {try {//创建serversocket,指定绑定的端口ServerSocket serverSocket = new ServerSocket(8888);//记录客户端数量int count = 0;//调用accept()方法监听客户端System.out.println("***Server is starting*****");Socket socket = null;while(true){//调用accept()监听客户端请求socket = serverSocket.accept();//创建新线程与客户端通信ServerThread serverThread = new ServerThread(socket);serverThread.start();count++;System.out.println("客户端数量为:"+count);InetAddress address = socket.getInetAddress();System.out.println("ip:"+ address.getHostAddress()); <span style="font-family: Arial, Helvetica, sans-serif;">//可以通过socket获取客户端主机ip地址</span>}} catch (IOException e) {e.printStackTrace();}}}
客户端的开发步骤如下:

1、创建socket,指定服务器地址和端口

2、用输出流向服务器端发送信息

3、用输入流获取服务器的反馈信息并打印到控制台

4、关闭相关流及socket

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;/* * 客户端 */public class Client {public static void main(String[] args) {try {//创建socket,指定服务器地址和端口Socket socket = new Socket("localhost",8888);//用输出流向服务器端发送信息OutputStream os = socket.getOutputStream();//变成打印流PrintWriter pw = new PrintWriter(os);pw.write("用户名:qiaqia;密码:1234");pw.flush();socket.shutdownOutput();//获取服务器的响应InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String info = null;while((info=br.readLine())!= null){System.out.println("我是客户端,服务器说:"+info);}socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}



0 0