java网络编程学习之——构建基于多线程的网络通信模型1
来源:互联网 发布:java写学生管理系统 编辑:程序博客网 时间:2024/05/20 05:24
该例展示了多用户/服务器通信模型,包含三个文件:Server.java ServerThread.java 和Client.java类。其中ServerThread类支持多线程,为客户提供的所有操作都封装到该类中,该类的构造方法ServerThread(Socket socket)接收一个套接字对象,用来与客户进行数据通信。Server类是一个应用程序,其main方法中通过一个无限的whlie循环,等待并监听多个用户连接请求(本例中只演示了一个客户请求),每个客户的连接都由服务器端的一个单独线程来处理,如此可实现多用户机/服务器之间的通信。
Server类的代码如下:
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * Server类接收客户端的套接字请求,然后创建一个ServerThread线程来处理请求 * @author Administration * */public class Server {public static void main(String[] args) {System.out.println("等待连接。。。");try {//1.创建一个套接字对象serverSocket,设置端口号为6666ServerSocket serverSocket = new ServerSocket(6666);Socket clientSocket = null;//2.监听套接字响应,一旦获得相应,则新建一个Serverhread类来处理这个响应while(true) {clientSocket = serverSocket.accept();//监听new ServerThread(clientSocket);}} catch (IOException e) {e.printStackTrace();}}}
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;public class ServerThread extends Thread {//客户端靠套接字private Socket clientSocket = null;//客户端输入流private InputStream clientInput = null;//客户端输出流private OutputStream clientOutput = null;//1.首先从构造方法中获得客户端的套接字请求,创建向客户端输入和输出的流,启动线程指执行接下来的请求public ServerThread(Socket socket) throws IOException {clientSocket = socket;clientInput = clientSocket.getInputStream();clientOutput = clientSocket.getOutputStream();this.start();}//2.线程启动后,通过缓冲流来获取从客户端传来的数据并进行分析,如果传过来的是“over”,则终止线程并关闭端口;//反之,则计算从客户端传过来的数值对应于正方形边长的面积,并将返回结果返回客户端,之后关闭端口public void run() {try {//构建缓冲输入流,获取客户端传过来的数据BufferedReader bufReader = new BufferedReader(new InputStreamReader(clientInput));//按行读取输入流内容(数据)String strLine = bufReader.readLine();//判断输入流数据if("OVER".equalsIgnoreCase(strLine)) {//创建输出流,传递“over”信息,表示连接结束PrintWriter printWriter = new PrintWriter(clientOutput,true);printWriter.println("连接OVER");}else {//输入正方形边长,并输出边长及面积double side = Double.parseDouble(strLine);side = Double.parseDouble(strLine);System.out.println("Side of Square Received:"+side);double squareArea = side*side;String str = "Side:"+side+"Square:"+squareArea;//创建输出流向客户端传递运算结果PrintWriter printWriter = new PrintWriter(clientOutput,true);printWriter.println(str);System.out.println("Finish sending to client!");}} catch (IOException e) {e.printStackTrace();}finally {//关闭流和端口try {clientInput.close();clientOutput.close();clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
客户端Client类代码如下:
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;import java.util.Scanner;/** * 客户端类 * @author Administration * */public class Client {public static void main(String[] args) {Socket socket = null;try {//1.根据端口号创建与服务器端的连接socket = new Socket("127.0.0.1",6666);//2.客户端从获取用户在控制台输入的信息//通过Scanner获取键盘输入的值System.out.println("Input Side:");Scanner keyInput = new Scanner(System.in);//按行读取键盘输入String strLine = keyInput.nextLine();//3.创建客户端的输入流和输出流,将用户输入的信息发送到服务器端,之后再接收来自服务器端的运算结果//获取服务器输入流OutputStream outputStream = socket.getOutputStream();//获取服务器输出流InputStream inputStream = socket.getInputStream();//通过PrintWriter输出流向服务器传数据PrintWriter printWriter = new PrintWriter(outputStream,true);printWriter.println(strLine);BufferedReader bufdReader = new BufferedReader(new InputStreamReader(inputStream));System.out.println(bufdReader.readLine());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {//4.关闭套接字和流socket.close();} catch (IOException e) {e.printStackTrace();}}}}
服务器端的运行结果:
等待连接。。。Side of Square Received:5.0Finish sending to client!
客户端的运行结果:
Input Side:5Side:5.0 Square:25.0
阅读全文
1 0
- java网络编程学习之——构建基于多线程的网络通信模型1
- linux网络编程之—多线程模型 .
- java学习之路——基于TCP的Socket网络通信实例
- java学习之路——基于UDP的Socket网络通信实例
- Linux网络编程之[基于socket通信的tcp协议的编程模型]
- Java网络编程+多线程通信
- Socket网络编程:基于TCP多线程通信
- Java------网络通信编程 之 菜鸟新手的学习总结
- linux网络编程之用多线程实现客户端到服务端的通信(基于udp)
- 网络编程模型综述 之 多线程模型
- Java网络通信编程学习
- java编程之网络通信
- Java网络编程之TCP网络通信
- Java网络编程之UDP网络通信
- 基于UDP的多线程网络通信程序
- Java多线程下的网络通信编程--图片传输
- C编程之基于UDP的网络通信
- JAVA网络编程之——TCP通信
- Struts2最新版(2.5.12)快速入门(二) Struts2之Action
- Oracle 使用analyze分析索引碎片
- 7.Score
- 【Spark】-- 交互式 shell
- 美国交通标志必知
- java网络编程学习之——构建基于多线程的网络通信模型1
- 无法访问 MemoryStream 的内部缓冲区
- Python--UDP时间服务器
- [LintCode]Remove Element(Python)
- 【PostgreSQL-9.6.3】Red Hat 4.4.7下的安装
- java 注解
- C#基础 属性 构造函数 静态构造函数 析构函数
- php 关于isset empty
- c语言内容对齐详解