用Java实现多线程socket通信_陈小艳
socket java 用法

socket java 用法在Java编程中,Socket是用于实现网络通信的一种机制。
它允许不同的计算机通过网络进行数据交换和通信。
使用Socket,你可以创建基于TCP或UDP协议的网络连接,并发送和接收数据。
以下是使用Socket进行网络通信的步骤:1. 创建服务器端首先,我们需要创建一个服务器端,用于接收来自客户端的连接请求。
可以使用ServerSocket类来实现。
代码示例:```javaServerSocket serverSocket = new ServerSocket(8080);Socket socket = serverSocket.accept();```在上面的代码中,我们创建了一个ServerSocket对象并指定了端口号8080。
然后,使用accept()方法等待客户端的连接请求,并返回一个Socket对象表示与客户端的连接。
2. 创建客户端创建一个客户端来连接服务器并进行通信。
可以使用Socket类来实现。
代码示例:```javaSocket socket = new Socket("localhost", 8080);```在上面的代码中,我们创建了一个Socket对象,并指定了服务器的主机名("localhost")和端口号(8080)。
3. 数据传输一旦建立了连接,我们可以通过Socket对象的输入流和输出流进行数据传输。
可以使用InputStream和OutputStream类来实现。
代码示例:```java// 从客户端发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write("Hello, Server!".getBytes());// 接收服务器发送的数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024];int length = inputStream.read(buffer);String response = new String(buffer, 0, length);System.out.println("Server response: " + response);```在上面的代码中,我们使用OutputStream将数据发送到服务器,然后使用InputStream接收来自服务器的响应。
java使用socket实现一个多线程web服务器的方法

java使⽤socket实现⼀个多线程web服务器的⽅法除了服务器类,还包括请求类和响应类请求类:获取客户的HTTP请求,分析客户所需要的⽂件响应类:获得⽤户请求后将⽤户需要的⽂件读出,添加上HTTP应答头。
发送给客户端。
服务器处理类package com.lp.app.webserver;import java.io.*;import .*;//使⽤Socket创建⼀个WEB服务器,本程序是多线程系统以提⾼反应速度。
class WebServer{public static String WEBROOT = "";//默认⽬录public static String defaultPage = "index.htm";//默认⽂件public static void main (String [] args) throws IOException{System.out.println ("服务器启动...\n");//使⽤8080端⼝提供服务ServerSocket server = new ServerSocket (8080);while (true){//阻塞,直到有客户连接Socket sk = server.accept ();System.out.println ("Accepting Connection...\n");//启动服务线程new WebThread (sk).start ();}}}//使⽤线程,为多个客户端服务class WebThread extends Thread{private Socket sk;WebThread (Socket sk){this.sk = sk;}//线程体public void run (){InputStream in = null;OutputStream out = null;try{in = sk.getInputStream();out = sk.getOutputStream();//接收来⾃客户端的请求。
Java中的网络编程和Socket通信篇

Java中的网络编程和Socket通信篇Java是一种面向对象的编程语言,具有强大的网络编程能力。
在Java中,使用Socket通信可以实现不同计算机之间的数据传输和通信。
本文将介绍Java中的网络编程以及Socket通信的相关知识。
一、网络编程简介网络编程是指在计算机网络环境下进行程序设计和开发的过程。
Java提供了丰富的类和方法来支持网络编程,例如包中的Socket和ServerSocket类,以及java.io包中的InputStream和OutputStream类等。
二、Socket通信基础Socket是一种抽象概念,表示在网络上的一个通信端口。
它可以用于在不同的计算机之间建立通信渠道,实现数据传输和通信。
Socket通信过程包括服务器端和客户端两个角色。
1.服务器端服务器端负责监听来自客户端的连接请求,并接受连接。
以下是服务器端的基本步骤:1)创建一个ServerSocket对象,指定服务器的端口号。
2)调用ServerSocket的accept()方法,监听客户端的连接请求。
3)一旦有客户端连接,通过accept()方法返回一个Socket对象,用于和客户端进行通信。
4)通过Socket对象的InputStream和OutputStream实现数据的读取和写入。
5)通信结束后,关闭Socket连接。
2.客户端客户端负责向服务器端发送连接请求,并进行数据的读取和写入。
以下是客户端的基本步骤:1)创建一个Socket对象,指定服务器的IP地址和端口号。
2)通过Socket对象的InputStream和OutputStream实现数据的读取和写入。
3)通信结束后,关闭Socket连接。
三、实例演示:客户端与服务器端的简单通信接下来,我们将通过一个实例来演示如何在Java中进行Socket通信。
1.服务器端代码:```javaimport java.io.*;import .*;public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务器已启动,等待客户端连接...");Socket socket = serverSocket.accept();System.out.println("客户端已连接!");InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message = bufferedReader.readLine();System.out.println("客户端发送的消息是:" + message);OutputStream outputStream = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("已收到消息!");bufferedWriter.flush();bufferedReader.close();bufferedWriter.close();socket.close();serverSocket.close();}}```2.客户端代码:```javaimport java.io.*;import .*;public class Client {public static void main(String[] args) throws Exception {Socket socket = new Socket("localhost", 8888);System.out.println("已经连接到服务器!");OutputStream outputStream = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("你好,服务器!");bufferedWriter.newLine();bufferedWriter.flush();InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String response = bufferedReader.readLine();System.out.println("服务器的响应是:" + response);bufferedWriter.close();bufferedReader.close();socket.close();}}```以上代码演示了一个简单的Socket通信过程,其中服务器端监听端口为8888,客户端连接到服务器并向其发送消息,服务器端接收消息并回复已收到的消息。
java中socket的用法

java中socket的用法Java中的Socket是一种网络通信协议,它可以在不同的计算机之间进行数据传输。
Socket是一种基于TCP/IP协议的网络通信协议,它可以在不同的计算机之间进行数据传输。
在Java中,Socket是一个类,它提供了一种简单的方式来实现网络通信。
Socket的用法在Java中,Socket的用法非常简单。
首先,我们需要创建一个Socket对象。
这个对象可以用来连接到另一个计算机上的Socket 对象。
在创建Socket对象时,我们需要指定要连接的计算机的IP 地址和端口号。
例如,下面的代码创建了一个Socket对象,它连接到IP地址为192.168.1.100,端口号为8080的计算机上:```Socket socket = new Socket("192.168.1.100", 8080);```一旦我们创建了Socket对象,我们就可以使用它来进行数据传输。
在Java中,Socket提供了两个流来进行数据传输:InputStream 和OutputStream。
InputStream用于从Socket中读取数据,而OutputStream用于向Socket中写入数据。
例如,下面的代码从Socket中读取数据:```InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024];int len = inputStream.read(buffer);String data = new String(buffer, 0, len);```这个代码片段首先获取了Socket的InputStream对象,然后创建了一个1024字节的缓冲区。
接下来,它调用了InputStream的read()方法来读取数据,并将读取的数据存储在缓冲区中。
最后,它将缓冲区中的数据转换为字符串。
Java多线程编程实现socket通信示例代码

Java多线程编程实现socket通信⽰例代码流传于⽹络上有关Java多线程通信的编程实例有很多,这⼀篇还算⽐较不错,代码可⽤。
下⾯看看具体内容。
TCP是Tranfer Control Protocol的简称,是⼀种⾯向连接的保证可靠传输的协议。
通过TCP协议传输,得到的是⼀个顺序的⽆差错的数据流。
发送⽅和接收⽅的成对的两个socket之间必须建⽴连接,以便在TCP协议的基础上进⾏通信,当⼀个socket(通常都是server socket)等待建⽴连接时,另⼀个socket可以要求进⾏连接,⼀旦这两个socket连接起来,它们就可以进⾏双向数据传输,双⽅都可以进⾏发送或接收操作。
UDP是User Datagram Protocol的简称,是⼀种⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。
⽐较:UDP:1,每个数据报中都给出了完整的地址信息,因此⽆需要建⽴发送⽅和接收⽅的连接。
2,UDP传输数据时是有⼤⼩限制的,每个被传输的数据报必须限定在64KB之内。
3,UDP是⼀个不可靠的协议,发送⽅所发送的数据报并不⼀定以相同的次序到达接收⽅TCP:1,⾯向连接的协议,在socket之间进⾏数据传输之前必然要建⽴连接,所以在TCP中需要连接时间。
2,TCP传输数据⼤⼩限制,⼀旦连接建⽴起来,双⽅的socket就可以按统⼀的格式传输⼤的数据。
3,TCP是⼀个可靠的协议,它确保接收⽅完全正确地获取发送⽅所发送的全部数据。
应⽤:1,TCP在⽹络通信上有极强的⽣命⼒,例如远程连接(Telnet)和⽂件传输(FTP)都需要不定长度的数据被可靠地传输。
但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占⽤计算机的处理时间和⽹络的带宽,因此TCP传输的效率不如UDP⾼。
2,UDP操作简单,⽽且仅需要较少的监护,因此通常⽤于局域⽹⾼可靠性的分散系统中client/server应⽤程序。
java中实现多线程的方法

java中实现多线程的方法Java是一种非常强大的编程语言,它支持多线程,这是Java的一个重要特性。
多线程允许同时执行多个任务,从而大大提高了应用程序的效率和性能。
在Java中实现多线程的方法有很多种,下面我们将一步步地阐述这些方法。
第一种方法是继承Thread类。
我们可以在Java中创建一个继承Thread类的子类,并在子类中实现run()方法。
在run()方法中编写多线程代码。
以下是示例代码:```class MyThread extends Thread {public void run() {//多线程代码}}```在上述代码中,我们创建了一个名为MyThread的子类,并重写了Thread类的run()方法。
第二种方法是实现Runnable接口。
这种方法需要创建一个实现Runnable接口的类,然后实例化一个Thread对象并将实现Runnable 接口的类作为参数传递给Thread对象。
以下是示例代码:class MyRunnable implements Runnable {public void run() {//多线程代码}}public class Main {public static void main(String[] args) {MyRunnable obj = new MyRunnable();Thread thread = new Thread(obj);thread.start();}}```在上述代码中,我们创建了一个名为MyRunnable的类,并实现了Runnable接口。
我们在主类中创建了一个MyRunnable对象,并通过传递该对象作为参数创建了一个Thread对象。
最后启动线程。
第三种方法是使用匿名内部类。
这种方法可以减少代码的数量。
以下是示例代码:```public class Main {public static void main(String[] args) {new Thread(new Runnable() {public void run() {//多线程代码}}).start();}```在上述代码中,我们使用匿名内部类创建了一个Runnable对象并启动了一个线程。
java多线程—Socket编程实例
多线程Java Socket编程示例这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.1.服务端package sterning;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 .*;import java.util.concurrent.*;public class MultiThreadServer {private int port=8821;private ServerSocket serverSocket;private ExecutorService executorService;//线程池private final int POOL_SIZE=10;//单个CPU线程池大小public MultiThreadServer() throws IOException{serverSocket=new ServerSocket(port);//Runtime的availableProcessor()方法返回当前系统的CPU数目.executorService=Executors.newFixedThreadPool(Runtime.getRuntime().av ailableProcessors()*POOL_SIZE);System.out.println("服务器启动");}public void service(){while(true){Socket socket=null;try {//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接 socket=serverSocket.accept();executorService.execute(new Handler(socket));} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) throws IOException {new MultiThreadServer().service();}}class Handler implements Runnable{private Socket socket;public Handler(Socket socket){this.socket=socket;}private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream();return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket) throws IOException{InputStream socketIn=socket.getInputStream();return new BufferedReader(new InputStreamReader(socketIn));}public String echo(String msg){return "echo:"+msg;}public void run(){try {System.out.println("New connection accepted "+socket.getInetAddress() +":"+socket.getPort());BufferedReader br=getReader(socket);PrintWriter pw=getWriter(socket);String msg=null;while((msg=br.readLine())!=null){System.out.println(msg);pw.println(echo(msg));if(msg.equals("bye"))break;}} catch (IOException e) {e.printStackTrace();}finally{try {if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}2.客户端package sterning;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import .Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MultiThreadClient {public static void main(String[] args) {int numTasks = 10;ExecutorService exec = Executors.newCachedThreadPool();for (int i = 0; i < numTasks; i++) {exec.execute(createTask(i));}}// 定义一个简单的任务private static Runnable createTask(final int taskID) { return new Runnable() {private Socket socket = null;private int port=8821;public void run() {System.out.println("Task " + taskID + ":start");try {socket = new Socket("localhost", port);// 发送关闭命令OutputStream socketOut = socket.getOutputStream();socketOut.write("shutdown\r\n".getBytes());// 接收服务器的反馈BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = null;while ((msg = br.readLine()) != null)System.out.println(msg);} catch (IOException e) {e.printStackTrace();}}};}}从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.再结合我之前的例子---Java基于Socket文件传输示例,就可以实现多线程文件的传输了评论# re: 多线程Java Socket编程示例回复更多评论2007-11-10 14:25 by xiongzeng请问作者:可不可以利用服务端主动发信?# re: 多线程Java Socket编程示例回复更多评论2007-12-07 13:12 by qifen膏药帖~~# re: 多线程Java Socket编程示例回复更多评论2008-01-07 22:19 by java综合网很好!不错!# re: 多线程Java Socket编程示例回复更多评论2008-03-14 11:36 by fgfdgdgdfggfdgdf# re: 多线程Java Socket编程示例回复更多评论2008-05-28 17:14 by 钟侥我也是参照孙的书,可是运行不能得到正确的结果!很是郁闷啊[code]package com.zz.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class EchoServer {private int port = 8000;private ServerSocket ss;public EchoServer() throws IOException {ss = new ServerSocket(port);System.out.println("server is starting...."); }private String echoString(String msg){ return "echo:" + msg;}public static void main(String[] args) {try {new EchoServer().service();} catch (IOException e) {e.printStackTrace();}}private void service(){while(true){Socket s = null;try{s = ss.accept();System.out.println("a client is coming......"); BufferedReader br = this.getReader(s); PrintWriter pw = this.getWriter(s);String msg = null;while((msg = br.readLine()) != null){ System.out.println(msg);pw.println(this.echoString(msg)+"\n"); pw.flush();if(msg.equals("bye")) break;}}catch(IOException e ){}}}private PrintWriter getWriter(Socket s) throws IOException {return new PrintWriter(s.getOutputStream());}private BufferedReader getReader(Socket s) throws IOException {return new BufferedReader(new InputStreamReader(s.getInputStream())); }}[/code]# re: 多线程Java Socket编程示例回复更多评论2008-05-28 17:15 by 钟侥package com.zz.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;public class EchoClient {private String host = "localhost";private int port = 8000;private Socket socket;private EchoClient() throws IOException {socket = new Socket(host, port);}public void talk() throws IOException {try {BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); BufferedReader localReader = new BufferedReader( new InputStreamReader(System.in));String msg = null;while ((msg = localReader.readLine())!= null) { pw.println(msg+"\n");pw.flush();System.out.println(br.readLine());if (msg.equals("bye"))break;}} catch (IOException e) {} finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}private PrintWriter getWriter(Socket s) throws IOException {return new PrintWriter(s.getOutputStream());}private BufferedReader getReader(Socket s) throws IOException {return new BufferedReader(new InputStreamReader(s.getInputStream())); }/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {new EchoClient().talk();}}# re: 多线程Java Socket编程示例回复更多评论2008-06-16 23:04 by 有猫相伴的日子这个代码有很多问题,如请求处理,怎么封装请求对象,把请求对象放一队列从服务器端怎么发消息到客户端.....# re: 多线程Java Socket编程示例回复更多评论2009-04-27 10:22 by fei貌似整体思想可以,但是,程序的问题就比较多了...# re: 多线程Java Socket编程示例[未登录] 回复更多评论2009-05-07 15:38 by jh第三方杀毒# re: 多线程Java Socket编程示例回复更多评论2009-05-07 17:14 by OverKill如果多个线程对同一资源进行读取,能保证资源的原子性吗?应该对资源加锁# re: 多线程Java Socket编程示例回复更多评论2009-05-17 15:52 by 点水点点正找这样的文章多谢# re: 多线程Java Socket编程示例[未登录] 回复更多评论2009-08-23 19:12 by Mark如何设定超时的问题呢?# re: 多线程Java Socket编程示例回复更多评论2010-05-09 13:48 by 诗特林fans我是java网络编程的初学者很想加诗特林为好友向你请教些问题。
java之Socket多线程传递对象
java之Socket多线程传递对象服务器端利⽤线程池回复客户端:public class Server implements Runnable {private final ServerSocket server;private final ExecutorService pool;public Server(int port, int poolSize) throws IOException {this.server = new ServerSocket(port);this.pool = Executors.newFixedThreadPool(poolSize);}public void run() {while (true) {Socket socket;try {socket = this.server.accept();pool.execute(new ServerRepleyLines(socket));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}ServerRepleyLines类具体代码,⾥⾯⽤到的数据类可以暂不考虑:public class ServerRepleyLines extends Thread {private DBHelper helper;private Socket client;public ServerRepleyLines(Socket client) {this.client = client;this.helper = new DBHelper();}@Overridepublic void run() {// TODO Auto-generated method stubtry {ObjectInputStream fin = new ObjectInputStream(new BufferedInputStream(this.client.getInputStream()));try {TicketInfo qa = (TicketInfo) fin.readObject();System.out.println(qa.getStarting_station());if (qa.getType() == 2) {LineInfos lines = this.helper.getAllLineInfos(qa.getStarting_station(), qa.getTerminal_station(),qa.getDate_time().toString());ObjectOutputStream fout = new ObjectOutputStream(client.getOutputStream());fout.writeObject(lines);fout.flush();}fin.close();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}客户端Socket传输对象:public LineInfos sendAndGetLinesInfo(TicketInfo ticket) {Socket socket = this.CreateASocket(2);try {ObjectOutputStream fout = new ObjectOutputStream(socket.getOutputStream());fout.writeObject(ticket);fout.flush();LineInfos lines = null;ObjectInputStream fin = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));try {lines = (LineInfos) fin.readObject();fin.close();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}fout.close();return lines;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}核⼼代码就这些:调⽤开启线程:Server server=new Server2(6668,3); server.start();。
JAVA-Socket-双工通讯实现方案
一 基本概念1.1 Socket 概念Socket 的准确定义是操作系统提供给应用调用网络协议收发信息的组件,在主流编程语言或者相关SDK 中都有相关的编程组件提供.在JAVA 中,就是 包中提供了ServerSocket 和Socket 等相关类来实现的。
Socket 桥接的是业务系统和传输系统,主要针对高实时性,大并发量的数据传输场景,比如监控视频流传输和物联网数据传输等。
1.2 双工模式客户端与服务端建立通道后,即可相互传输信息和回应信息,通过一个socket 通道来发送和回复消息即可以认为是双工模式,相对的单工模式就是在两条通道来分别发送和接收消息,由于信息的读写欧式阻塞的,所有需要开启对应守护进程来分别处理消息发送和接收:ServerScoketHandlerSocket SocketHandler a c c e p t1.3 网络上的数据网络传输的数据一般都是以流,更细的情况以包的形式来传输数据的,就是一组byte 数组的形式,所以上层应用我们熟悉的编码和格式化数据在此范畴可能都是被弱化的,所以数据传输的方案应该是基于流和包的模式,这就要求要将业务数据转换,分割,装饰,组合然后按交换协议在客户端和服务端之间传输数据。
1.4 网络字节序为了数据可以在socket上进行传输,我们需要先对数据进行序列化处理,本文主要介绍字符串类型数据和结构体类型的数据块序列化和传输的方案。
对于分组或者按数据类型单元去组合传输数据的,要注意字节是大端字节序(高位字节排放在网络字节流的高位)还是小端的字节序(低位字节排放在网络字节流的高端)的,并在客户端解包时按需调节字节序。
这个和操作系统,编程语言甚至编程SDK提供的装饰器有关。
一般情况下,C++是小端发送模式,JAVA,GO等是大端发送i)模式。
这里要和存储字节序有一些区分。
简单的类比就是:如果要传输数据的数据是:1234567890,高端是先把1(万位)压到管道里就是大端,而先把数据5(个位)压到管道里就是小端(实际情况要根据数据的byte 编码类型来具体处理)。
用Java实现多线程socket通信_陈小艳
用Java 实现多线程socket 通信陈小艳(湖北广播电视大学,湖北武汉430074)[内容提要] Java 是一种可用于进行网络编程的语言,它提供的Socket 通讯类可以用来实现网络上数据信息的传递。
本文详细阐述了Socket 的通信流程,并通过实例讲解了多线程Socket 通信的实现过程。
[关键词] Java;socket;多线程;通信[中图分类号] TP31 [文献标识码] A [文章编号] 1008-7427(2008)01-0157-02Java 是一种可用于进行网络编程的语言,它与InternetWeb 密切结合,提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket 通讯的类,来满足用户各种不同的要求。
Java 的网络类库内容丰富,有多个子类库,可以支持多种Internet 协议。
在这篇文章中,主要介绍多线程socket 编程的java 实现方法,用到的类为.Socket 和.ServerSocket。
Socket 也就是套接字,是TCP/IP 协议的编程接口,是运行在网络上的两个程序间双向通讯连接的末端,它提供客户端和服务器端的连接通道。
Socket 绑定于特定端口这样TCP 层就知道将数据提供给哪个应用程序。
我们先来看一下socket 通信的流程:1.服务器端创建ServerSocket 对象,绑定某个端口,进行监听,等待客户端的连接请求;2.客户端创建Socket 对象,向服务器和特定端口请求连接;3.服务器端接受客户端的连接请求,产生新的socket,用此socket 建立和客户端的连接;4.通过向socket 读写数据实现服务器端和客户端的通信;5.通信完毕,服务器端关闭与客户端通信的socket,客户端socket 对象关闭,服务器端serversocket 对象关闭,以及一些其它的结束工作;清楚了socket 通信的流程,下面具体考察这两个类。
ServerSocket 类:ServerSocket 对象的创建:ServerSocket server_socket=new ServerSocket(port);此语句创建了一个ServerSocket 类的对象server_socket它提供监听服务的端口号是port 得值,如1234。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用Java 实现多线程socket 通信陈小艳(湖北广播电视大学,湖北武汉430074)[内容提要] Java 是一种可用于进行网络编程的语言,它提供的Socket 通讯类可以用来实现网络上数据信息的传递。
本文详细阐述了Socket 的通信流程,并通过实例讲解了多线程Socket 通信的实现过程。
[关键词] Java;socket;多线程;通信[中图分类号] TP31 [文献标识码] A [文章编号] 1008-7427(2008)01-0157-02Java 是一种可用于进行网络编程的语言,它与InternetWeb 密切结合,提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket 通讯的类,来满足用户各种不同的要求。
Java 的网络类库内容丰富,有多个子类库,可以支持多种Internet 协议。
在这篇文章中,主要介绍多线程socket 编程的java 实现方法,用到的类为.Socket 和.ServerSocket。
Socket 也就是套接字,是TCP/IP 协议的编程接口,是运行在网络上的两个程序间双向通讯连接的末端,它提供客户端和服务器端的连接通道。
Socket 绑定于特定端口这样TCP 层就知道将数据提供给哪个应用程序。
我们先来看一下socket 通信的流程:1.服务器端创建ServerSocket 对象,绑定某个端口,进行监听,等待客户端的连接请求;2.客户端创建Socket 对象,向服务器和特定端口请求连接;3.服务器端接受客户端的连接请求,产生新的socket,用此socket 建立和客户端的连接;4.通过向socket 读写数据实现服务器端和客户端的通信;5.通信完毕,服务器端关闭与客户端通信的socket,客户端socket 对象关闭,服务器端serversocket 对象关闭,以及一些其它的结束工作;清楚了socket 通信的流程,下面具体考察这两个类。
ServerSocket 类:ServerSocket 对象的创建:ServerSocket server_socket=new ServerSocket(port);此语句创建了一个ServerSocket 类的对象server_socket它提供监听服务的端口号是port 得值,如1234。
为了随时监听可能的客户端请求,还应该执行如下的语句:Socket client=server_socket.accept();Accept()方法的执行,是服务器端的程序一直处于等待状态,直到捕捉到来自客户端的连接请求。
结束监听,需要用到语句server_socket.close();Socket 类:创建Socket 对象:Socket client_socket=new Socket (hostname,port);其中hostname 为希望连接到的服务器名称,可以用IP 表示,port 为其提供服务的端口号。
Socket 对象建立成功后,就可以在客户端和服务器端建立一个连接,并通过此连接传递数据了。
Thead 类:介绍完ServerSocket类和Socket类,再来看一下多线程。
单线程的程序只有一条从头到尾的执行路线,但是在实际的开发过程中,可能需要很多过程同时运作,比如服务器可能需要同时处理多个客户机的请求,这时就需要用到多线程。
多线程是指同时存在几个执行体,按照不同的执行路线共同工作的情况,Java 语言的一个重要特点就是支持多线程,使得开发多线程程序变得相当容易。
Java 中编程实现多线程应用有两种途径,本文的多线程实现是通过用户自己创建的线程子类SocketThread 来实现的。
以上三个类的具体用法及作用在程序中详细注释。
下面我们看一个完整的socket 通信的例子,此例子在j2sdk1.4.1,eclipse2.1.2 下测试通过。
服务器端(server.java)package multi_thread_socket_communication;//包名public class Server extends Thread//服务器端为Thread 线程子类,以便实时监控是否有客户端有连接请求{protected ServerSocket serversocket ;// 定义一个ServerSocket 对象public Server(int port)//构造函数{try{serversocket=new ServerSocket(port);//服务器端监听端口号port}System.out.println("Server is listening on port "+port);this.start();}public void run()//服务器端线程开始启动,开始实时监控客户端的连接请求{try{while(true)//如果有客户端的连接请求,将执行{}内的操作{ Socket clientsocket=serversocket.accept();//新建客户端Socket 对象SocketThread st=new SocketThread(clientsocket);//启动一个客户端线程,并且一直监听,直到退出;若有多个客户端请求,则会新建多个客户端线程,由此实现多线程st.start();//连接的客户端线程启动} } }public static void main(String args[]){Server server=new Server(1234);//服务器端启动监听端口1234}}客户端(Client.java)package multi_thread_socket_communication;……public class Client {public Client(String hostname,int port)//构造函数{try{Socket clientsocket=new Socket(hostname,port);PrintWriter out=new PrintWriter(clientsocket.getOut- putStream(),true);//输出信息给服务器端BufferedReader in=new BufferedReader(new InputStre- amReader(clientsocket.getInputStream()));//用来接受相联接的服务器返回给客户端的信息BufferedReader user_in=new BufferedReader (new InputStreamReader(System.in));//接受用户输入的信息String line_user;//用来保存用户输入的每条信息String line_server;//用来保存服务器端到客户端的信息while((line_user=user_in.readLine())!=null){if(line_user.equals("88"))//如客户端输入88,则此客户端断开与服务器端的连接Break;out.println(line_user);line_server=in.readLine ();System.out.println("Client Receive From Server:"+line_- server);}out.close();in.close();clientsocket.close();} }public static void main(String[] args){Client client=new Client("127.0.0.1",1234);}}子线程类:package multi_thread_socket_communication;public class SocketThread extends Thread{private Socket clientsocket=null;public SocketThread(Socket s){clientsocket=s;}public void run(){try{PrintWriter out=new PrintWriter(clientsocket.getOutp-utStream(),true);//输出信息给服务器端BufferedReader in=new BufferedReader(new InputStrea-mReader(clientsocket.getInputStream()));//用来接受相连接的服务器返回给客户端的信息String line;while((line=in.readLine())!=null){out.println(line);System.out.println("Message From "+clientsocket+" to Server:"+line);//在控制台打印出发送消息给服务器端的客户端的信息和发送的消息}in.close();out.close();clientsocket.close();}}}运行结果:1.激活Server.java,运行Eclipse 下的菜单Run RunAs Java Application,即可以在控制台中看到消息:Server islistening on port 1234,表示服务器端已经开始监听端口1234,可以随时接受客户端的连接请求。
2.激活Client.java,Run Run As Java Application,可以执行Run 命令多次,执行多少次表示有多少个客户端,在各个客户端的控制台中分别输入信息。
例如:在第三个客户端的控制台中输入message3,回车,则会显示ClientReceive From Server:message3,表示消息已经发送到了服务器端,并且从服务器端发回来的消息为message3。
我们来看一下服务器端的控制台,通过SocketThread类中的语句System.out.println("Message From “+clients-ocket+”to Server:"+line);在服务器的控制台中就会显示出连接的三个客户端信息及其各自发给服务器端的信息。
在各个客户端的控制台中输入88 即可断开其与服务器的连接。
以上是多线程的Socket 通信的实现过程,掌握好Socket是学好Java 的重要前提,通过Socket 不仅可以实现消息的发送,还可以实现服务器端和客户端之间文件的相互传送,这也是Java 网络特性的一大特色。