java socket-TCP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java socket-TCP相关的知识,希望对你有一定的参考价值。
【服务端】
创建ServerSocket对象,绑定监听端口
通过accept()方法监听客户端请求
建立连接后,通过输入流读取客户端发送的请求信息
通过输出流向客户端发送响应信息
关闭相关资源
【客户端】
创建socket对象,指明需要连接的服务器地址和端口号
连接建立后,通过输出流向服务器端发送请求信息
通过输入流获取服务器响应信息
关闭相关资源
【多线程服务器】
应用多线程来实现服务器与多客户端之间的通信基本步骤
1.服务器端创建ServerSocket,循环调用accept()等待客户端连接
2.客户端创建一个socket并请求和服务器端的连接
3.服务器端接受客户端请求,创建socke与该客户建立专线连接
4.建立连接的两个socket在一个单独的线程上对话
5.服务器端继续等待新的连接
【代码】:
package testsocket; 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 Buddha * */ public class ServerThread extends Thread { // 和本线程相关的Socket Socket socket = null; // 带参数的构造方法 public ServerThread(Socket socket) { this.socket = socket; } // 线程执行的操作,响应客户端的请求 public void run() { // 字节输入流 InputStream is = null; // 为了提高读取的性能,将字节输入流进行包装,把它变为字符流 InputStreamReader isr = null; // 为字符流添加缓冲,以缓冲的方式读取 BufferedReader br = null; OutputStream os = null; // 转为打印流 PrintWriter pw = null; // 选中要抛出异常的代码,按shift+alt+z 然后就可以选中try catch,会自动给你抛异常 try { // 3.获取一个输入流,读取客户端信息 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(); // 4.获取输出流,响应客户端的请求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("欢迎"); pw.flush();// 刷新缓存 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 5.关闭资源 try { //if (pw != null) //对于同一个socket,如果关闭了输出流会导致socket也会被关闭,所以一般不用关闭输出流,直接关闭socket即可。 //pw.close(); if (os != null) os.close(); if (os != null) br.close(); if (isr != null) isr.close(); if (is != null) is.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
package testsocket; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * 基于TCP协议的通信,实现用户登录 * @author Buddha * 服务器端 */ public class Server { public static void main(String[] args) { try { //1.创建一个服务器端Socket,既ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket =new ServerSocket(8888); Socket socket=null; //记录客户端的数量 int count = 0; //2.调用accept()方法开始监听,等待客户端的链接 System.out.println("=======服务器即将启动,等待客户端的链接======"); //循环监听等待客户端的链接 while(true){ socket=serverSocket.accept(); //创建一个新的线程 ServerThread serverThread=new ServerThread(socket); //设置线程优先级,1-10.默认为5,避免运行时速度慢 serverThread.setPriority(4); //启动线程 serverThread.start(); //统计客户端的数量 count++; System.out.println("客户端的数量:"+count); //获取InetAddress实例 InetAddress address=socket.getInetAddress(); //获取客户端的IP System.out.println("当前客户端的IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }
package testsocket; 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 { // 1.创建客户端socket,指定服务器地址和端口 Socket socket = new Socket("localhost", 8888); // 2.获取输出流,向服务器发送信息 // 字节输出流 OutputStream os = socket.getOutputStream(); //将输出流包装为打印流 PrintWriter pw =new PrintWriter(os); pw.write("用户名:admin;密码:123"); //刷新缓存,向服务端输出信息 pw.flush(); //关闭输出流 //不能使用pw.close()来关闭输出流,需要使用socket.shutdownOutput()来关闭当前的输出流,结束数据的输出 socket.shutdownOutput(); //3.获取输入流,并读取服务器端的响应信息 InputStream is=socket.getInputStream(); BufferedReader br= new BufferedReader(new InputStreamReader(is)); String info =null; while((info=br.readLine())!=null){ System.out.println("我是客户端,服务器说"+info); } //4.关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // } }
以上是关于java socket-TCP的主要内容,如果未能解决你的问题,请参考以下文章