JAVA Socket 编程学习
来源:互联网 发布:笔画笔顺查询软件 编辑:程序博客网 时间:2024/05/29 02:40
简介:
下面是我在慕课上听完JAVA Socket课程后的学习总结,需要的小伙伴可以看下。
工具:IntelliJ IDEA
1. Socket 通信
Java Socket 实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。
2. Socket 通信实现方法
2.1 服务器端(非多线程)
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送相应信息
⑤ 关闭相关资源
代码实现类:
import java.io.*;import java.net.ServerSocket;import java.net.Socket;/** * 基于TCP 协议的Socket通信,实现用户登录 * 服务器端 * Created by Administrator on 2017/9/28. */public class TestServerSocket { public static void main(String[] args) { ServerSocket serverSocket= null; Socket socket=null; try { //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 serverSocket = new ServerSocket(8888); System.out.println("***服务器即将启动,等待客户端的连接"); //2、调用accept()方法开始监听,等待客户端的连接 socket=serverSocket.accept(); //3、获取输入流,并读取客户端信息 InputStream inputStream=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8")); String data=null; while((data=br.readLine())!=null) { System.out.println("我是服务器,客户端说:"+data); } socket.shutdownInput();//关闭输入流 //4、获取输出流,响应客户端的请求 OutputStream os=socket.getOutputStream(); PrintWriter pw=new PrintWriter(os); pw.write("欢迎你!"); pw.flush(); //关闭资源 pw.close(); os.close(); br.close(); inputStream.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } }}
2.2 客户端
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
代码实现类:
import java.io.*;import java.net.Socket;/** * 客户端 * Created by Administrator on 2017/9/28. */public class TestSocket { public static void main(String[] args) { try { //1、创建客户端Socket,指定服务器地址和端口 Socket socket=new Socket("localhost",8888); //2、获取输出流,向服务器端发送信息 OutputStream outputStream=socket.getOutputStream(); PrintWriter pw=new PrintWriter(outputStream); pw.write("用户名:admin;密码:123"); pw.flush(); socket.shutdownInput(); //3、获取输入流,并读取服务器端的响应信息 InputStream inputStream=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8")); String data=null; while((data=br.readLine())!=null) { System.out.println("我是客户端,服务器说:"+data); } //关闭资源 br.close(); inputStream.close(); pw.close(); outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }}
3.应用多线程实现服务器与多客户端之间的通信
3.1新建服务器端线程处理类
import java.io.*;import java.net.Socket;/** * 服务器端线程处理类 * Created by Administrator on 2017/9/28. */public class ServerThread extends Thread { //和本线程相关的socket Socket socket = null; public ServerThread(Socket socket) { this.socket = socket; } public void run() { //服务器处理代码 //3、获取输入流,并读取客户端信息 InputStream inputStream = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; try { inputStream = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); String data = null; while ((data = br.readLine()) != null) { System.out.println("我是服务器,客户端说:" + data); } socket.shutdownInput();//关闭输入流 //4、获取输出流,响应客户端的请求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("欢迎你!"); pw.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 try { if (pw != null) { pw.close(); } if (os != null) { os.close(); } if (br != null) { br.close(); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }}
3.2 服务器端 (多线程)
①服务器端创建ServerSocket,循环调用accept()等待客户端连接
②客户端创建一个socket并请求和服务器端连接
③服务器端接受客户端请求,创建socket与该客户建立专线连接
④ 建立连接的两个socket在一个单独的线程上对话
⑤ 服务器端继续等待新的连接
代码实现类:
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 服务器端(多线程) * Created by Administrator on 2017/9/28. */public class ThreadServerSocket { public static void main(String[] args) { try { //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket = new ServerSocket(8888); Socket socket = null; //记录客户端的数量 int count = 0; System.out.println("***服务器即将启动,等待客户端的连接"); //循环监听等待客户端的连接 while (true) { //调用accept()方法开始监听,等待客户端的连接 socket = serverSocket.accept(); //创建一个新的线程 ServerThread serverThread = new ServerThread(socket); //启动线程 serverThread.start(); count++; System.out.println("客户端连接的数量:" + count); //获取当前客户端的IP地址 InetAddress address=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } }}
阅读全文
0 0
- JAVA Socket 编程学习
- Java:Socket编程学习总结
- JAVA socket编程学习笔记
- JAVA学习笔记- Socket编程
- java socket编程学习笔记
- java socket 编程学习笔记
- JAVA Socket编程学习3
- JAVA Socket编程学习2
- Java Socket编程简捷学习过程
- Java Socket编程简捷学习过程
- JAVA Socket编程学习(一)
- Java Socket编程简捷学习过程
- Java Socket编程简捷学习过程
- java网络编程Socket学习(一)
- java网络编程Socket学习(二)
- JAVA之Socket编程初步学习
- Java Socket 编程学习之 TCP
- Java Socket 编程学习之 UDP
- K-Means聚类算法的原理及实现
- poj 1273 Drainage Ditches
- 9月28日训练日记
- cin慢解决方案
- 编程题目1
- JAVA Socket 编程学习
- Tyvj4878:道路修建 (环套树DP+单调队列)
- 旋转矩阵和变换矩阵
- EA&UML日拱一卒-活动图::14.4 ProtocolStateMachines
- java设计模式之原型模式,如何实现深克隆
- 启动Tomcat的时候报错:java.lang.Cl assCastException: net.sf.cglib.proxy.Enhancer$EnhancerKey$$KeyFactoryByCG
- 智力3
- HDU:Prime Ring Problem
- Codeforces Round #436 (Div. 2)