java中异步socket类的实现和源代码
java 实现异步的几种案例方法
java 实现异步的几种案例方法Java是一种高级编程语言,它具有强大的异步编程能力。
在Java中,实现异步编程的方法有很多种,下面将介绍几种常见的实现异步编程的方法。
1. 使用Future和Callable接口Future和Callable接口是Java中实现异步编程的基础。
Callable接口定义了一个带有返回值的任务,而Future接口则表示一个异步计算的结果。
通过将Callable任务提交给ExecutorService线程池,可以异步执行任务,并通过Future接口获取任务的结果。
例如,下面的代码演示了如何使用Future和Callable接口实现异步编程:```ExecutorService executor =Executors.newSingleThreadExecutor();Future<String> future = executor.submit(new Callable<String>() {public String call() throws Exception {// 执行异步任务return "异步任务执行完成";}});// 获取异步任务的结果String result = future.get();```2. 使用CompletableFuture类CompletableFuture类是Java 8中新增的一个类,它提供了更加灵活和强大的异步编程能力。
通过CompletableFuture类,可以将多个异步任务组合起来,实现更加复杂的异步编程逻辑。
例如,下面的代码演示了如何使用CompletableFuture类实现异步编程:```CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行异步任务return "异步任务执行完成";});future.thenAccept(result -> {System.out.println(result);});```3. 使用RxJava库RxJava是一个基于观察者模式的异步编程库,它提供了丰富的操作符和组合方式,可以轻松地实现复杂的异步编程逻辑。
Socket调用方式(同步,异步,阻塞,非阻塞)
Socket调⽤⽅式(同步,异步,阻塞,⾮阻塞)同步:我调⽤⼀个功能,该功能没有结束前,我死等结果。
异步:当⼀个异步过程调⽤发出后,调⽤者不能⽴刻得到结果。
该功能在完成后,通过状态、通知和回调来通知调⽤者。
同步和⾮同步关注的是调⽤者是否等待等待调⽤结果。
举个通俗的例⼦:你打电话问书店⽼板有没有《分布式系统》这本书,如果是同步通信机制,书店⽼板会说,你稍等,”我查⼀下",然后开始查啊查,等查好了(可能是5秒,也可能是⼀天)告诉你结果(返回结果)。
⽽异步通信机制,书店⽼板直接告诉你我查⼀下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。
然后查好了,他会主动打电话给你。
在这⾥⽼板通过“回电”这种⽅式来回调。
阻塞:调⽤我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
⾮阻塞:调⽤我(函数),我(函数)⽴即返回通知调⽤者以最常⽤的send和recv两个函数为例⽐如你调⽤send函数发送⼀定的Byte,在系统内部send做的⼯作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执⾏成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有⾜够的可⽤缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和⾮阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有⾜够的空间把你要发送的数据Copy过去以后才返回,⽽对于⾮阻塞的socket来说send会⽴即返回WSAEWOULDDBLOCK告诉调⽤者说:"发送操作被阻塞了!!!你想办法处理吧..."对于recv函数,同样道理,对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知⼀个结果给它它就⼀直不返回:耗费着系统资源....对于⾮阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头再来看看"阻塞I/O模型:⾮阻塞I/O模型:阻塞和⾮阻塞关注的是调⽤者在等待调⽤结果时的状态。
java异步原理
java异步原理
Java中的异步原理是通过多线程实现的。
在传统的同步编程中,代码是按照顺序执行的,遇到阻塞操作时会发生阻塞,直到操作完成才会继续执行下一行代码。
而异步编程则可以在进行阻塞操作时,不必等待结果返回,而是可以继续执行后续的代码逻辑。
Java中异步编程常用的方式有使用线程池和Future,以及Java 8以后引入的CompletableFuture。
使用线程池和Future可以通
过submit方法提交任务到线程池中,返回一个Future对象,
通过该对象可以在需要的时候获取异步任务的结果。
当需要获取异步任务的结果时,可以通过调用Future对象的get方法来
阻塞等待结果返回。
CompletableFuture是Java 8引入的新特性,用于简化异步编程的复杂性。
它可以通过一系列的操作链来实现异步任务之间的依赖关系,如thenApply、thenAccept、thenCompose等方法。
通过这些方法可以实现任务的串行执行,也可以实现任务的并行执行。
CompletableFuture还提供了各种回调方法和异常处理方法,可以方便地处理异步任务的结果。
在异步编程中,需要注意处理线程安全问题。
多线程同时访问共享的资源时,可能会导致数据不一致或者线程安全问题。
可以通过使用锁机制或者使用线程安全的数据结构来解决这些问题。
总之,Java中的异步编程通过多线程实现,可以通过线程池和
Future、CompletableFuture等方式来实现异步任务的执行和结果的处理。
同时需要注意处理线程安全问题。
java 不同系统之间传输数据的方法
java 不同系统之间传输数据的方法Java是一种强大且广泛应用的编程语言,用于开发各种类型的应用程序。
在实际开发中,经常需要在不同的系统之间传输数据。
本文将介绍一些常用的方法来实现Java不同系统之间的数据传输。
1. 使用Socket通信Socket通信是一种常用的网络通信方式,可以实现不同系统之间的数据传输。
通过Socket,我们可以在客户端和服务器之间建立一条双向通道进行数据交换。
在Java中,可以使用Java的原生Socket库来实现Socket通信。
客户端和服务器端通过准确的IP地址和端口号来建立连接。
客户端可以使用Socket类来与服务器进行通信,而服务器则使用ServerSocket类监听并接受客户端连接。
2. 使用HTTP协议HTTP协议是一种应用层协议,常用于Web应用程序中。
通过HTTP协议,不同系统之间可以通过发送和接收HTTP请求和响应来进行数据传输。
在Java中,可以使用Java的HttpURLConnection类或者第三方库,如Apache 的HttpClient来实现HTTP通信。
通过发送HTTP请求,可以将数据以请求参数或JSON/XML等格式发送到目标系统,并接收目标系统的HTTP响应。
3. 使用WebServiceWebService是一种通过网络进行通信的软件系统。
它可以使不同系统之间的应用程序通过Web服务接口进行数据传输和交互。
在Java中,可以使用Java的JAX-WS和JAX-RPC等API来开发和使用WebService。
通过定义WebService接口和实现相应的服务端和客户端,可以在不同系统之间轻松地传输数据。
4. 使用消息队列消息队列是一种常用的异步通信方式,允许不同系统之间以消息的形式传递数据。
消息队列将数据发送方发送的消息存储在队列中,接收方从队列中接收并处理消息。
在Java中,可以使用ActiveMQ、RabbitMQ等消息中间件来实现消息队列。
java异步处理方法
java异步处理方法在Java中,异步处理方法允许程序在执行任务时不必等待结果返回,而是继续执行其他操作。
这种方式可以提高程序的性能和响应能力,特别适用于处理需要等待较长时间才能完成的任务,比如网络请求、文件读写、数据库操作等。
Java提供了多种处理异步任务的机制。
下面是几种常用的方法:1. 线程池(ThreadPoolExecutor):使用线程池可以方便地管理和复用线程。
可以使用java.util.concurrent包中的ThreadPoolExecutor来创建一个线程池,并提交任务给线程池进行处理。
线程池会自动分配线程来执行任务,并在任务完成后将结果返回。
2. CompletableFuture:这是Java 8引入的一种新的异步编程方式。
CompletableFuture类提供了一系列方法来处理异步任务的执行结果。
它可以通过thenApply()、thenAccept()、thenRun()等方法来指定任务完成后的处理操作,也可以通过thenCompose()、thenCombine()等方法来组合多个异步任务。
3. 回调函数(Callback):回调函数是一种常见的异步编程模式,它可以在任务完成后回调指定的方法。
在Java中,可以使用接口作为回调函数的实现,将任务的结果传递给回调方法进行处理。
4. CompletableFuture与回调函数的结合:CompletableFuture类可以与回调函数相结合使用,实现更加灵活的异步处理方式。
可以使用thenApplyAsync()、thenAcceptAsync()等方法指定任务完成后的回调函数,并通过supplyAsync()、runAsync()等方法创建CompletableFuture实例。
需要注意的是,在使用异步处理方法时,需要注意线程安全性和资源管理。
确保在多线程环境下的正确性和性能。
另外,异步处理可能会导致代码逻辑的复杂性增加,需要合理设计和组织代码结构,确保代码的可读性和可维护性。
java异步编排的实现方式
java异步编排的实现方式Java异步编排是一种在多个任务之间进行协调和管理的技术,可以提高程序的执行效率和性能。
在Java中,有多种实现方式可以实现异步编排,例如使用线程池、Future和CompletableFuture等。
一、线程池线程池是一种用于管理和复用线程的机制。
在Java中,可以通过ThreadPoolExecutor类来创建和使用线程池。
线程池可以通过提供一定数量的线程来执行任务,当任务执行完毕后,线程可以被复用,避免了线程的频繁创建和销毁。
使用线程池可以实现异步编排的效果,通过提交任务到线程池中,线程池会按照一定的调度算法来执行任务,并提供一些监控和控制的机制。
二、FutureFuture是Java提供的一个接口,用于表示一个异步计算的结果。
通过Future可以获取异步计算的结果,或者取消异步计算的执行。
在Java中,可以通过ExecutorService.submit方法返回一个Future对象,然后通过Future的get方法来获取异步计算的结果。
使用Future可以实现异步编排,通过提交多个任务到线程池中,然后通过Future来获取任务的执行结果,当所有任务都执行完毕后,再进行下一步的操作。
三、CompletableFutureCompletableFuture是Java 8中引入的一个新特性,用于简化异步编程的复杂性。
CompletableFuture可以将多个异步任务串行或并行地执行,并提供了丰富的方法来处理异步任务的结果。
使用CompletableFuture可以实现更加灵活和高效的异步编排。
例如,可以使用CompletableFuture的thenCompose方法将多个任务串行执行,或者使用CompletableFuture的allOf方法来等待所有任务执行完毕后再进行下一步的操作。
总结:Java异步编排是一种提高程序执行效率和性能的技术。
在Java中,可以使用线程池、Future和CompletableFuture等方式来实现异步编排。
websocket的java写法
WebSocket是一种在单个TCP连接上进行全双工通信的协议。
它原生支持在Web浏览器和Web服务器之间进行实时数据传输。
在Java 中,我们可以使用不同的库来实现WebSocket通信。
本文将介绍WebSocket的Java写法,并提供一个示例项目来演示如何在Java中实现WebSocket。
一、WebSocket的Java库在Java中,有几个主要的库可以用来实现WebSocket通信。
其中最流行的是javax.websocket包,以及基于它的几个实现,比如Tyrus 和Tomcat。
除了这些库,还有一些第三方库,比如Java-WebSocket和Netty,也可以用来实现WebSocket通信。
二、使用javax.websocket包javax.websocket包是JavaEE 7中新增加的一个用来实现WebSocket通信的标准API。
它提供了一组接口和注解,可以让我们很容易地创建WebSocket端点和客户端。
下面是一个简单的Java WebSocket端点的例子:```javaimport javax.websocket.OnClose;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;ServerEndpoint("/websocket")public class MyWebSocket {OnOpenpublic void onOpen(Session session) {System.out.println("WebSocket opened: " + session.getId()); }OnClosepublic void onClose(Session session) {System.out.println("WebSocket closed: " + session.getId()); }}```在这个例子中,我们创建了一个名为MyWebSocket的WebSocket 端点。
socket建立tcp连接的java代码
socket建立tcp连接的java代码Socket是Java中常用的网络编程类,可以用于建立TCP连接,完成客户端和服务器间的通信。
下面是Socket建立TCP连接的Java代码:1. 建立Socket对象TCP协议在建立连接时,需要同时指定服务器的IP地址和端口号。
因此,在客户端程序中,需要先创建一个Socket对象来指定需要连接的服务器IP地址和端口号。
Socket socket=new Socke t(“192.168.1.1”, 8888);2. 获取输入输出流建立连接之后,客户端可以向服务器发送数据,还可以接收服务器返回的数据。
为了完成这些操作,需要获取输入输出流对象。
InputStream input=socket.getInputStream();OutputStream output=socket.getOutputStream();3. 发送数据客户端想要向服务器发送数据,可以通过输出流对象write()方法实现。
byte[] data=”Hello Server”.getBytes();output.write(data);4. 接收数据客户端从服务器接收数据,可以通过输入流对象read()方法实现。
byte[] buffer=new byte[1024];int len=input.read(buffer);5. 断开连接客户端和服务器通信结束之后,需要关闭连接。
input.close();output.close();socket.close();综上所述,以上代码实现了Socket建立TCP连接的过程,使得客户端和服务器能够互相通信,完成所需的业务操作。
java socket 实现原理
java socket 实现原理
Java的Socket是一种用于网络通信的编程接口。
它基于
TCP/IP协议,通过在不同计算机之间建立连接,实现了进程
之间的通信。
在Java中,Socket通信包括客户端和服务器端两个角色。
客
户端通过创建一个Socket对象来发起连接,服务器端通过创
建一个ServerSocket对象来监听连接请求。
具体实现原理如下:
1. 客户端创建一个Socket对象,指定服务器的IP地址和端口号。
Socket对象会封装了TCP/IP协议的相关信息,如IP地址
和端口号等。
2. 客户端通过Socket对象的connect()方法发起连接请求,向
服务器发送一个特定格式的数据包。
3. 服务器端创建一个ServerSocket对象,绑定到指定的IP地
址和端口号上。
4. 服务器端通过ServerSocket对象的accept()方法监听来自客
户端的连接请求。
当有连接请求到达时,accept()方法会返回
一个新的Socket对象,用于和客户端进行通信。
5. 客户端和服务器端通过各自的Socket对象进行数据的收发。
客户端通过输出流向服务器发送数据,服务器通过输入流接收
客户端发送的数据;服务器通过输出流向客户端发送数据,客户端通过输入流接收服务器发送的数据。
6. 当通信完成后,可以通过关闭Socket对象来结束连接。
通过以上步骤,客户端和服务器端能够通过Socket对象实现双向的数据传输。
Socket提供了简单、灵活和高效的网络通信方式,广泛应用于各种应用场景中。
Java中的Socket用法
Java中的Socket⽤法转发链接:(1)Java中的Socket⽤法Java中的Socket分为普通的Socket和NioSocket。
(2)普通Socket⽤法创建ServerSocket。
ServerSocket的构造⽅法有5个,其中最⽅便的是ServerSocket(int port),只需要⼀个port就可以了。
Java中的⽹络通信时通过Socket实现的,Socket分为ServerSocket和Socket两⼤类,ServerSocket⽤于服务器端,可以通过accept⽅法监听请求,监听请求后返回Socket,Socket⽤于完成具体数据传输,客户端也可以使⽤Socket发起请求并传输数据。
ServerSocket的使⽤可以分为三步:调⽤创建出来的ServerSocket的accept⽅法进⾏监听。
accept⽅法是阻塞⽅法,也就是说调⽤accept⽅法后程序会停下来等待连接请求,在接受请求之前程序将不会继续执⾏,当接收到请求后accept⽅法返回⼀个Socket。
使⽤accept⽅法返回的Socket与客户端进⾏通信 如下代码,我们在服务器端创建ServerSocket,并调⽤accept⽅法监听Client的请求,收到请求后返回⼀个Socket。
public class Server {public static void main(String[] args) {// TODO Auto-generated method stubtry {//创建⼀个ServerSocket监听8080端⼝ServerSocket server = new ServerSocket(8080);//等待请求Socket socket = server.accept();//接受请求后使⽤Socket进⾏通信,创建BufferedReader⽤于读取数据BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = is.readLine();System.out.println("received frome client:" + line);//创建PrintWriter,⽤于发送数据PrintWriter pw = new PrintWriter(socket.getOutputStream());pw.println("this data is from server");pw.flush();//关闭资源pw.close();is.close();socket.close();server.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} 然后我们再看看客户端的Socket代码,Socket的使⽤也是⼀样,⾸先创建⼀个Socket,Socket的构造⽅法⾮常多,这⾥⽤的是Socket(String host, int port),把⽬标主机的地址和端⼝号传⼊即可(本实验代码中服务器和Client代码没有在同⼀台机器上,服务器的IP地址:192.168.6.42,所以如果读者在实验过程中ServerSocket和Client在同⼀主机下,那么Client中的IP地址需要更改为:127.0.0.1,Socket 创建的过程就会跟服务器端建⽴连接,创建完Socket后,再创建Writer和Reader来传输数据,数据传输完成后释放资源关闭连接。
Socket编程介绍
Socket编程介绍Socket编程是一种计算机网络编程,它利用Socket库和通信协议将不同计算机之间的进程相互联系起来,以完成数据通信和资源共享等功能。
Socket编程是一种跨平台的网络编程方式,可以在多种操作系统上使用,比如Windows、UNIX、Linux等。
Socket编程的核心在于网络协议,其中最常用的是TCP/IP协议。
TCP/IP协议是一个以分组交换方式进行数据传输的网络协议,它将数据分成许多小的数据包进行传输,每个小的数据包在传输过程中都可以独立处理。
这种分段传输的方式使得TCP/IP协议具有高效、安全、灵活、可靠、可扩展、可配置等特点,被广泛应用于Internet上。
Socket编程可以使用不同的编程语言实现,比如C、C++、Java、Python等。
其中C、C++语言是最常用的,因为它们可以更好地控制底层操作,提高性能和效率。
而Python编程语言则由于其简洁、易学、易用等特点,成为很多初学者的首选。
Socket编程常见的应用有:网络浏览器、邮件客户端、文件传输工具、远程控制工具、网游等。
以网络浏览器为例,当用户在浏览器中输入网址时,浏览器会利用Socket编程与Web服务器建立连接,向服务器请求相应的网页资源,服务器接收到请求后,会将相应的网页资源发回给浏览器,浏览器将网页资源显示在用户的屏幕上。
在Socket编程中,每个进程都是一个网络服务,并且都有一个唯一的IP地址和端口号。
IP地址是指互联网协议地址,用于唯一标识一台计算机所在的网络,它通常由四个十进制数(xxx.xxx.xxx.xxx)表示。
端口号是指进程与操作系统通信的口令,表示计算机传输数据的通道,其取值范围为0~65535,其中0~1023被系统保留,一般用于常用的网络服务,比如HTTP、FTP、Telnet等。
Socket编程中两个进程之间的数据传输通常分为两种模式:阻塞模式和非阻塞模式。
在阻塞模式下,进程需要等待数据传输完毕后才能继续处理其他事情,这种方式适用于数据处理量不大的情况,但在数据传输量大、网络状况差的情况下,会导致性能降低。
c#Socket异步通信源码
服务器端代码:namespace Server{public partial class Server2 : Form{delegate void MsgRef(string msg);public Server2(){InitializeComponent();}AsySocket listener = null;SortedList<string, AsySocket> clients = new SortedList<string, AsySocket>();delegate void CallBackRef(string msg);private void button1_Click(object sender, EventArgs e){//监听listener = new AsySocket(this.textBox1.Text, Int32.Parse(textBox2.Text));listener.OnAccept += new AcceptEventHandler(listener_OnAccept);listener.Listen(10);this.button1.Enabled = false;}void listener_OnAccept(AsySocket AcceptedSocket){//注册事件AcceptedSocket.OnStringDataAccept += new StringDataAcceptHandler(AcceptedSocket_OnStringDataAccept); AcceptedSocket.OnClosed += new AsySocketClosedEventHandler(AcceptedSocket_OnClosed);AcceptedSocket.BeginAcceptData();//加入clients.Add(AcceptedSocket.ID, AcceptedSocket);}void AcceptedSocket_OnClosed(string SocketID, string ErrorMessage){//客户端关闭clients.Remove(SocketID);}private void AddMsg(string msg){if (txtMsg.InvokeRequired){CallBackRef c = new CallBackRef(AddMsgCallBack);this.Invoke(c, new object[] { msg });}else{txtMsg.Text += Environment.NewLine + msg;}}private void AddMsgCallBack(string msg){txtMsg.Text += Environment.NewLine + msg;}void AcceptedSocket_OnStringDataAccept(string AccepterID, string AcceptData){try{//显示//this.txtMsg.Text += AccepterID + ": " + AcceptData + Environment.NewLine;MsgRef m = new MsgRef(AddMsg);this.Invoke(m, new object[] { AcceptData });//转发for (int i = 0; i < clients.Count; i++){if (clients.Values[i].ID != AccepterID){clients.Values[i].ASend(AcceptData);}}}catch (Exception e){MessageBox.Show(e.Message);}}private void btnSend_Click(object sender, EventArgs e){if (txtSend.Text == "")return;//转发for (int i = 0; i < clients.Count; i++){clients.Values[i].ASend("服务器:" + txtSend.Text + AsySocket.EndChar);}//txtMsg.Text += "发送:" + txtSend.Text + Environment.NewLine;AddMsg("发送:" + txtSend.Text);txtSend.Text = "";txtSend.Focus(); }}}namespace Client{public delegate void StreamDataAcceptHandler(string AccepterID, byte[] AcceptData);public delegate void StringDataAcceptHandler(string AccepterID, string AcceptData);public delegate void AsySocketEventHandler(string SenderID, string EventMessage);public delegate void AcceptEventHandler(AsySocket AcceptedSocket);public delegate void AsySocketClosedEventHandler(string SocketID, string ErrorMessage);///<summary>/// State object for receiving data from remote device.///</summary>public class StateObject{// Client socket.public Socket workSocket = null;// Size of receive buffer.public const int BufferSize = 1024;// Receive buffer.public byte[] buffer = new byte[BufferSize];// Received data string.public StringBuilder sb = new StringBuilder();}///<summary>///文件名称:AsySocket.cs///描述:异步传输对象///</summary>public class AsySocket{public AsySocket(string LocalIP, int LocalPort){mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{IPAddress ip = Dns.GetHostAddresses(LocalIP)[0];IPEndPoint ipe = new IPEndPoint(ip, LocalPort);mID = Guid.NewGuid().ToString();mSocket.Bind(ipe);}catch (Exception e){//ErrLog.RecordErr(e, ModuleName, "AsySocket", "");}}///<param name="LinkObject">指定的Socket连接</param>public AsySocket(Socket linkObject){ mSocket = linkObject;mID = Guid.NewGuid().ToString();#region私有字段private Socket mSocket = null;string mID = "";private const string ModuleName = "GYGameServer.AsySocket";private StreamDataAcceptHandler onStreamData = null;private StringDataAcceptHandler onStringData = null;private AsySocketEventHandler onSended = null;private AsySocketEventHandler onSendTo = null;private AcceptEventHandler onAccept = null;private AsySocketClosedEventHandler onClosed = null;#endregion#region公共属性public static string EndChar{get{return new string((char)0, 1);}}public string ID{get{return mID;}}///<summary>///发送、接受数据的结尾标志///</summary>public static char LastSign{get{return (char)0;}}///<summary>///获取、设置连接对象///</summary>public Socket LinkObject{get{return mSocket;}set{mSocket = value;}}#endregion#region公共方法///<summary>///监听///</summary>public void Listen(int backlog){if (mSocket == null)throw new ArgumentNullException("连接不存在");mSocket.Listen(backlog);mSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);//异步}///<summary>///开始接受数据///</summary>public void BeginAcceptData(){if (mSocket == null)throw new ArgumentNullException("连接对象为空");//开始接收数据StateObject state = new StateObject();state.workSocket = mSocket;mSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);//receiveDone.WaitOne();}///<summary>///发送二进制数据///</summary>///<param name="SendData"></param>public void ASend(byte[] SendData){if (mSocket == null)throw new ArgumentNullException("连接不存在");if (SendData == null)return;mSocket.BeginSend(SendData, 0, SendData.Length, 0, new AsyncCallback(SendCallBack), mSocket);//sendDone.WaitOne();}///<summary>///发送文本数据///</summary>///<param name="SendData"></param>public void ASend(string SendData){if (SendData.Length == 0)return;this.ASend(UTF8Encoding.UTF8.GetBytes(SendData));}///<summary>/// UDP发送二进制数据///</summary>///<param name="SendData"></param>///<param name="EndPoint">目标端点</param>public void ASendTo(byte[] SendData, IPEndPoint EndPoint){if (mSocket == null)throw new ArgumentNullException("连接不存在");if (SendData == null)return;mSocket.BeginSendTo(SendData, 0, SendData.Length, 0, EndPoint, new AsyncCallback(SendToCallBack), null);//sendToDone.WaitOne();}///<summary>/// UDP发送文本数据///</summary>///<param name="SendData"></param>///<param name="EndPoint"></param>public void ASendTo(string SendData, IPEndPoint EndPoint){if (SendData.Length == 0)return;ASendTo(UTF8Encoding.UTF8.GetBytes(SendData), EndPoint);}#endregion#region私有方法private void AcceptCallBack(IAsyncResult ar){Socket handler = mSocket.EndAccept(ar);AsySocket NewSocket = new AsySocket(handler);//激发事件if (onAccept != null)onAccept(NewSocket);//重新监听mSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);}private void ReceiveCallback(IAsyncResult ar){try{StateObject state = ar.AsyncState as StateObject;//读取数据int bytesRead = mSocket.EndReceive(ar);if (bytesRead > 0){state.sb.Append(UTF8Encoding.UTF8.GetString(state.buffer, 0, bytesRead));string sb = state.sb.ToString();if (sb.Substring(sb.Length - 1, 1) == EndChar){//接收完成//激发事件if (onStreamData != null)onStreamData(mID, UTF8Encoding.UTF8.GetBytes(sb));if (onStringData != null)onStringData(mID, sb);//state = new StateObject();state.workSocket = mSocket;}// Get the rest of the data.mSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);}}catch (SocketException se){if (onClosed != null)onClosed(ID, se.Message);}catch (Exception e){throw new ApplicationException(e.Message);}}private void SendCallBack(IAsyncResult ar){try{mSocket.EndSend(ar);//sendDone.Set();//触发事件if (onSended != null)onSended(mID, "OK");}catch (SocketException se){if (onClosed != null)onClosed(ID, se.Message);}catch (Exception e){//throw new ApplicationException(e.Message); }}private void SendToCallBack(IAsyncResult ar){try{mSocket.EndSendTo(ar);//sendToDone.Set();if (onSendTo != null)onSendTo(mID, "OK");}catch (SocketException se){if (onClosed != null)onClosed(ID, se.Message);}catch (Exception e){throw new ApplicationException(e.Message); }}#endregion#region事件///<summary>///连接关闭的事件///</summary>public event AsySocketClosedEventHandler OnClosed{add{onClosed += value;}remove{onClosed -= value;}}///<summary>///接受连接的事件///</summary>public event AcceptEventHandler OnAccept{add{onAccept += value;}remove{onAccept -= value;}}///<summary>///接收二进制数据事件///</summary>public event StreamDataAcceptHandler OnStreamDataAccept {add{this.onStreamData += value;}remove{this.onStreamData -= value;}}///<summary>///接收文本数据事件///</summary>public event StringDataAcceptHandler OnStringDataAccept {add{onStringData += value;}remove{onStringData -= value;}}///<summary>///发送成功事件///</summary>public event AsySocketEventHandler OnSended {add{onSended += value;}remove{onSended -= value;}}///<summary>/// UTP发送成功事件///</summary>public event AsySocketEventHandler OnSendTo {add{onSendTo += value;}remove{onSendTo -= value;}}#endregion}}。
socket,java,通信协议
编号:______________ _本资料为word版本,可以直接编辑和打印,感谢您的下载socket,java,通信协议甲方:___________________乙方:___________________日期:___________________socket,java, 通信协议篇一:socket通信java代码客户端代码:importjava.io.bufferedReader; importjava.io.ioexception;importjava.io.inputstream;importjava.io.inputstreamReader; importjava.io.outputstream;.socket;.unknownhostexception; publicclassloginclient{ publicstaticvoidmain(string[]args){//todoauto-generatedmethodstubtry{socketsocket=newsocket("localhost”,8800); inputstreamis=socket.getinputstream(); outputstreamos=socket.getoutputstream(); stringinfo=" 用户名:tom;用户密码:123456”; os.write(info.getbytes());socket.shutdownoutput();stringreply=null;bufferedReaderbr=newbufferedReader(newinputstreamRe ader(is));while(!((reply=br.readline())==null)){system.out.println(" 我是客户端,服务器响应为:"+reply);}br.close();os.close();is.close();socket.close();}catch(unknownhostexceptione){//todoauto-generatedcatchblocke.printstacktrace();}catch(ioexceptione){//todoauto-generatedcatchblocke.printstacktrace();}}}服务器端代码:importjava.io.bufferedReader;importjava.io.ioexception;importjava.io.inputstream;importjava.io.inputstreamReader;importjava.io.outputstream;.serversocket;.socket;publicclassloginserver( /** *@paramargs */publicstaticvoidmain(string[]args){ //todoauto-generatedmethodstubtry{ serversocketserversocket=newserversocket(8800 );while(true){ socketsocket=serversocket.accept();inputstreamis=socket.getinputstream();outputstreamos=socket.getoutputstream(); bufferedReaderbr=newbufferedReader(newinputstreamRe ader(is));stringinfo=null;while(!((info=br.readline())==null))(system.out.println(" 我是服务器,用户信息为: +info);}stringreply=" 欢迎你,登陆成功!";os.write(reply.getbytes());br.close();os.close();is.close();socket.close();serversocket.close();}}catch(ioexceptione)(//todoauto-generatedcatchblocke.printstacktrace();}}}篇二:java+socket实现双机通信河南理工大学计算机科学与技术学院课程设计报告20xx — 20xx学年第二学期课程名称计算机网络设计题目利用javasocket实现双机通信学生姓名学号专业班级指导教师20xx年6月20日目录利用javasock实现双机通信一、设计任务1. 利用winsock来实现双机通信,理解tcp状态机图。
Java网络编程(Socket基础,多线程socket,socket中文乱码问题)学习笔记
Java⽹络编程(Socket基础,多线程socket,socket中⽂乱码问题)学习笔记1.概念2.简单TCP通信代码,⽤两个java程序模拟客户端和服务器端。
客户端代码:TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据表⽰客户端的类:.Socket:此类实现客户端套接字(也可以就叫“套接字”)。
套接字是两台机器间通信的端点。
套接字:包含了IP地址和端⼝号的⽹络单位构造⽅法:Socket(String host, int port) 创建⼀个流套接字并将其连接到指定主机上的指定端⼝号。
参数:String host:服务器主机的名称/服务器的IP地址int port:服务器的端⼝号成员⽅法:OutputStream getOutputStream() 返回此套接字的输出流。
InputStream getInputStream() 返回此套接字的输⼊流。
void close() 关闭此套接字。
实现步骤:1.创建⼀个客户端对象Socket,构造⽅法绑定服务器的IP地址和端⼝号2.使⽤Socket对象中的⽅法getOutputStream()获取⽹络字节输出流OutputStream对象3.使⽤⽹络字节输出流OutputStream对象中的⽅法write,给服务器发送数据4.使⽤Socket对象中的⽅法getInputStream()获取⽹络字节输⼊流InputStream对象5.使⽤⽹络字节输⼊流InputStream对象中的⽅法read,读取服务器回写的数据6.释放资源(Socket)注意:1.客户端和服务器端进⾏交互,必须使⽤Socket中提供的⽹络流,不能使⽤⾃⼰创建的流对象2.当我们创建客户端对象Socket的时候,就会去请求服务器和服务器经过3次握⼿建⽴连接通路这时如果服务器没有启动,那么就会抛出异常ConnectException: Connection refused: connect如果服务器已经启动,那么就可以进⾏交互了import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .Socket;import java.util.Scanner;public class TCPClient {public static void main(String[] args) throws IOException {Scanner cin = new Scanner(System.in);Socket socket = new Socket("127.0.0.1",8888);InputStream is = socket.getInputStream();while(true){//给服务器端发数据System.out.println("请输⼊你要向服务器发送的数据:");String sendMessage = cin.nextLine();OutputStream os = socket.getOutputStream();os.write(sendMessage.getBytes());//接收服务器端发过来的数据byte[] getMessage = new byte[1024];int len = is.read(getMessage);String message = new String(getMessage,0,len);System.out.println("收到服务器端发来的数据为: "+message);}}}服务器端代码:TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据表⽰服务器的类:.ServerSocket:此类实现服务器套接字。
java代码try catch中调用异步方法
java代码try catch中调用异步方法如何在Java的try-catch块中调用异步方法?当我们在编写Java代码时,我们经常会使用try-catch块来处理异常。
try-catch块允许我们在发生异常时捕获并处理它们,以避免程序崩溃。
然而,如果我们的代码中包含异步方法调用,try-catch块的使用可能会变得有些棘手。
异步方法是一种非阻塞调用方式,允许程序在等待结果返回的同时继续执行其他任务。
这种方式对于处理I/O密集型操作或者需要与外部服务交互的任务非常有用,可以提高程序的响应性能和吞吐量。
在Java中调用异步方法可以使用多种方式,例如使用Java的线程池、CompletableFuture类、RxJava等。
在本文中,我们将重点关注使用CompletableFuture类来调用异步方法,并在try-catch块中正确处理异常。
首先,我们需要了解CompletableFuture类的一些基本概念。
CompletableFuture是Java 8引入的一个类,用于异步编程。
它提供了一些方法,可以轻松地创建、组合和执行异步任务。
在使用CompletableFuture调用异步方法时,我们可以通过调用supplyAsync()方法创建一个CompletableFuture对象。
该方法接收一个Supplier类型的参数,用于执行异步任务并返回结果。
下面是一个示例代码:CompletableFuture<String> future =CompletableFuture.supplyAsync(() -> {执行异步任务return "Hello, World!";});在这个示例中,我们创建了一个CompletableFuture对象,它将在异步任务执行完成后返回一个字符串"Hello, World!"。
可以看到,使用CompletableFuture的supplyAsync()方法,我们可以轻松地创建一个异步任务。
java socket 规约通讯,同步等待异步响应的写法
java socket 规约通讯,同步等待异步响应的写法在Java中,你可以使用Socket和ServerSocket类进行网络通信。
下面是一个基本的示例,展示了如何实现同步等待异步响应的通讯方式。
首先,我们需要创建一个ServerSocket来监听来自客户端的连接请求:```javaServerSocket serverSocket = new ServerSocket; // 创建 ServerSocket 对象并绑定到指定端口```然后,我们可以使用accept()方法来等待客户端的连接请求。
这个方法会阻塞当前线程,直到有客户端连接到服务器:```javaSocket clientSocket = (); // 等待客户端连接```一旦有客户端连接到服务器,我们就可以使用输入流和输出流进行数据交换。
在这个例子中,我们假设客户端发送一个字符串到服务器,服务器将这个字符串转换成一个整数并返回给客户端:```javaInputStream inputStream = (); // 获取输入流OutputStream outputStream = (); // 获取输出流BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); // 将输入流转换为字符流PrintWriter writer = new PrintWriter(outputStream); // 将输出流转换为打印流String request = (); // 读取客户端发送的字符串int result = (request); // 将字符串转换为整数(result); // 将整数发送给客户端(); // 刷新缓冲区,确保数据被发送出去```最后,我们需要关闭输入输出流和套接字:```java(); // 关闭输入流(); // 关闭输出流(); // 关闭套接字```完整的代码如下:```javaimport ;import ;public class Server {public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket; // 创建ServerSocket 对象并绑定到指定端口Socket clientSocket = (); // 等待客户端连接InputStream inputStream = (); // 获取输入流OutputStream outputStream = (); // 获取输出流BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); // 将输入流转换为字符流PrintWriter writer = new PrintWriter(outputStream); // 将输出流转换为打印流String request = (); // 读取客户端发送的字符串int result = (request); // 将字符串转换为整数(result); // 将整数发送给客户端(); // 刷新缓冲区,确保数据被发送出去(); // 关闭输入流(); // 关闭输出流(); // 关闭套接字}}```。
JavaSocket实现聊天室附1500行源代码
JavaSocket实现聊天室附1500⾏源代码⽬录项⽬需求分析基础分析项⽬部分代码摘要Dao的链表存储实现ServerListenServerReceive再看⼀下客户端的ClientReceive项⽬问题选择框中出现的不是⽤户名服务端点击消息发送按钮没有反应不能显⽰在线⼈数服务端退出时没有消息Java养成计划(打卡第31,2天)内容管理:Sockect聊天室的实现Java界⾯使⽤了各种组件,对于这部分不了解的不⽤担⼼,⽬前掌握⼀个⼤概就OK项⽬需求分析需要完成⼀个简单聊天⼯具的界⾯及功能,实现服务器中转下的多客户端之间的通信,系统完成的功能有程序启动后能看到当前有那些机器上线,可弹出对话聊天框,可以在其中编辑要发送的聊天信息,并进⾏发送⼀旦某个⽹内的机器上线了,可即时通知,并能更新⽤户界⾯的⽤户列表双击某个列表项时,可弹出对话聊天框,可以在其中编辑要发送的信息并发送聊天界⾯⼈性化,下⾯时发送框,上⾯有已有聊天记录,并借助滚动条看到当次所有聊天记录当有⼈向本机器发送消息时,可显⽰⽤户接收到的信息,并且显⽰是谁所发,同时进⾏信息的回复基础分析⾸先这是⼀个聊天⼯具,使⽤的是C/S结构,要模拟就要使⽤net的Scocket和ServerSocket模拟客户端和服务端这⾥综合运⽤了多种知识,已经不再是简单的java SE知识,其中界⾯编程占据主要代码,这⾥可以贴⼏张图看看效果,这是我肝了2天才肝完的,这⾥已经可以实现多态设备的连接分为3个包Sever包主要是服务器的相关代码,主要是实现与⽤户的交互Dao包是模拟的数据库包,存储所有的⽤户信息,实现增删改的操作Client是客户代码包,只要在电脑上运⾏这⾥的代码,就可以出现客户端界⾯,约定好ip和端⼝号就可以通信了。
这⾥就真正实现了客户端型软件,只是软件功能简单,可以使⽤web编程实现另外⼀种架构可以来看⼀下界⾯再来看⼀下客户端和服务端的交流项⽬部分代码摘要Dao的链表存储实现package Dao;/*** 演⽰程序为了简化就不⽤数据库存储,使⽤单链表完成数据库各项功能* 这⾥⼀定要写测试代码检查各项功能是否可⽤* 最开开始我测试了add,del,find功能,却没有测试getCount功能,结果存在问题,后⾯突然放开测试才发现错误 */public class UserLinkList {private Node head;private int count;public boolean addUser(Node client){if(head == null){//头节点也存储数据head = client;count++;return true;}else {Node p = head;for(;p.next != null;p = p.next);{p.next = client;count++;return true;}}}public int getCount() {return count;}public Node findUser(String name){Node p = head;while(p != null )//p.next != null没有包含最后⼀个结点{if(ername.equals(name)){return p;}p = p.next;}return null;}public Node findUser(int index){int pos = 0;Node p = head;while(p != null&& pos < index){p = p.next;pos++;}if(p != null&& pos == index){return p;}return null;}public boolean delUser(Node client){//删除后长度也要减少Node p = head;if(ername.equals(ername)){//删除头结点head = head.next;count--;return true;}while(p != null){//忘记循环了if(ername.equals(ername)){p.next = p.next.next;count--;return true;}p = p.next;}return false;}/*** 这⾥可以设置⼀个显⽰的⽅法,供检查使⽤*/public void display() {Node p = head;int pos = 1;while(p != null){System.out.println("第"+pos + "个⽤户"+ername);p = p.next;pos++;}}}/*public static void main(String[] args) {//经过测试发现没有问题,可以正常使⽤ Node client1 = new Node();ername = "张三";Node client2 = new Node();ername = "李四";Node client3 = new Node();ername = "王五";//其他的就不测试了,反正该项就可以测试了UserLinkList userLinkList = new UserLinkList();//⾃动初始化userLinkList.addUser(client1);userLinkList.addUser(client2);userLinkList.addUser(client3);// userLinkList.display();Node node = userLinkList.findUser(0);userLinkList.delUser(node);userLinkList.display();System.out.println(userLinkList.getCount());}*/现在编写这段代码应当是⾮常简单的,注意⼀定要测试ServerListen简单看⼀下这个监听线程,可以监听⽤户是否上线package Server;/*** @author OMEY-PC*本程序的作⽤是实现服务器侦听的线程化,其中run⽅法通过client = new Node();创建⼀个客户端对象,通过client.socket = server.accept来设定接⼝,通过client.input *output来建⽴输⼊输出流*/import java.io.*;import .*;import Dao.*; //连接数据import javax.swing.*;public class ServerListen extends Thread{ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;Node client;ServerReceive recvThread;public boolean isStop;/*** 聊天服务端的⽤户上下线侦听类*/public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textField,UserLinkList userLinkList) {this.server = server;bobox = combobox;this.textarea = textarea;this.textfield = textField;erLinkList = userLinkList;isStop = false;}@Overridepublic void run() {while(!isStop && !server.isClosed())//没有停⽌服务{try {client = new Node();client.socket = server.accept();//⽤来指代所连接的客户端client.output = new ObjectOutputStream(client.socket.getOutputStream());client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream());ername = (String)client.input.readObject();//显⽰提⽰信息combobox.addItem(ername);//改成⽤户名userLinkList.addUser(client);textarea.append("⽤户" + ername+"上线"+"\n");textfield.setText("在线⽤户"+ userLinkList.getCount()+"⼈\n");recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.start();//启动线程}catch (Exception e) {e.printStackTrace();}}}}ServerReceive该线程实现服务器与⽤户之间的信息交互package Server;/*** @author OMEY-PC*服务器收发消息的类*/import .ServerSocket;import javax.swing.*;import Dao.*;public class ServerReceive extends Thread{JTextArea textarea;//消息展⽰域JTextField textfield;//⽂本输⼊域JComboBox combobox; //复选框Node client;//⽤户UserLinkList userLinkList;public boolean isStop;public ServerReceive(JTextArea textarea, JTextField textfield, JComboBox combobox, Node client,UserLinkList userLinkList) {this.textarea = textarea;this.textfield = textfield;bobox = combobox;this.client = client;erLinkList = userLinkList;isStop = false;}@Overridepublic void run(){//向所有⼈发送⽤户的列表sendUserList();while(!isStop && !client.socket.isClosed()){try {//类型,对谁,状况,⾏为,信息String type = (String)client.input.readObject();if(type.equalsIgnoreCase("聊天信息")){String toSomebody =(String)client.input.readObject();//从客户端接收信息String status = (String)client.input.readObject();String action = (String)client.input.readObject();String message = (String)client.input.readObject();String msg = ername+" "+ action + "对"+ toSomebody +" 说 " + message + "\n";//接收的消息 if(status.equalsIgnoreCase("悄悄话")){msg = "[悄悄话]" + msg; //若为悄悄话,就在前⾯加上标识}textarea.append(msg);if(toSomebody.equalsIgnoreCase("所有⼈")){sendToAll(msg);//这⾥是接受的⽤户消息,和之前的向所有⼈发消息不⼀样}else {//向⽤户发消息try {client.output.writeObject("聊天信息");client.output.flush();//刷新流client.output.writeObject(msg);client.output.flush();}catch (Exception e) {e.printStackTrace();}Node node = userLinkList.findUser(toSomebody);if(node != null){node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);//向选定信息发送信息node.output.flush();//刷新输出流缓冲区中的信息}}}else if(type.equalsIgnoreCase("⽤户下线")){Node node = userLinkList.findUser(ername);userLinkList.delUser(node);String msg = "⽤户"+ ername +"下线\n";int count = userLinkList.getCount();combobox.removeAllItems();combobox.addItem("所有⼈");int i = 0;while(i < count){node = userLinkList.findUser(i);if(node == null){i++;continue;}combobox.addItem(ername);i++;}combobox.setSelectedIndex(0);//选择第⼀个,所有⼈textarea.append(msg);textfield.setText("在线⽤户"+ userLinkList.getCount() +"⼈\n");sendToAll(msg);sendUserList();//重新发送⽤户列表break;}}catch (Exception e) {e.printStackTrace();}}}/*** 向所有⼈发送消息*/public void sendToAll(String msg){int count = userLinkList.getCount();int i = 0;while(i < count){//给⽤户列表中的每⼀个⼈都发送消息Node node = userLinkList.findUser(i);if(node == null){i++;continue;}try {//输出流node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);//聊天消息写⼊输出流(to client)node.output.flush();}catch (Exception e) {e.printStackTrace();}i++;}}/*** 向所有⼈发送⽤户列表*/public void sendUserList() {String userList = "";int count = userLinkList.getCount();int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null){i++;continue;}userList += ername;userList += "\n";i++;}i = 0; //给每个⼈发送消息while(i < count){Node node = userLinkList.findUser(i);if(node == null){i++;continue;}try {node.output.writeObject("⽤户列表");node.output.flush();node.output.writeObject(userList);node.output.flush();}catch (Exception e) {e.printStackTrace();}}i++;}}/*** 本程序可以实现通过线程向所有⼈发送消息,⽤户列表,以及向选定的⼈发送聊天消息等,主要是是实现服务端收发消息的线程化,其中sendUserList()发送列表, * client.input.redObject()获取客户端发送到服务端的消息,通sendToAll(),将发送到发送到所有⼈的信息发送到各个客户端*/再看⼀下客户端的ClientReceive该线程是实现客户端与系统之间的信息交互,注解丰富package Client;import java.io.*;import .*;import javax.swing.*;public class ClientReceive extends Thread{private JComboBox combobox;private JTextArea textarea;Socket socket;ObjectOutputStream output;ObjectInputStream input;JTextField showStatus;public ClientReceive(JComboBox combobox, JTextArea textarea, Socket socket, ObjectOutputStream output,ObjectInputStream input, JTextField showStatus) {bobox = combobox;this.textarea = textarea;this.socket = socket;this.output = output;this.input = input;this.showStatus = showStatus;}@Overridepublic void run() {//从服务端获得消息while(!socket.isClosed()){try {String type = (String)input.readObject();//获得流,read读取信息if(type.equalsIgnoreCase("系统信息")){String sysmsg = (String)input.readObject();textarea.append("系统信息" + sysmsg);}else if(type.equalsIgnoreCase("服务关闭")){output.close();input.close();socket.close();textarea.append("服务器已经关闭!\n");break;}else if(type.equalsIgnoreCase("聊天信息")){String message = (String)input.readObject();textarea.append(message);}else if(type.equalsIgnoreCase("⽤户列表")){String userlist = (String)input.readObject();String[] usernames = userlist.split("\n"); //⽤换⾏符分隔combobox.removeAll();//先移出去int i = 0;combobox.addItem("所有⼈");while(i < usernames.length){combobox.addItem(usernames[i]);i++;}combobox.setSelectedIndex(0);showStatus.setText("在线⽤户"+ usernames.length +" ⼈");}}catch (Exception e) {e.printStackTrace();}}}}其余的界⾯的部分就不放出来了,代码太长,每个都有400多⾏,如果有兴趣,就到我的gitee上去浏览,后⾯会放上地址项⽬问题选择框中出现的不是⽤户名查找相应模块发现是因为addItem中添加的时结点,⽽不是结点中的username,修改后正常服务端点击消息发送按钮没有反应查找监听器部分,发现监听器监听该部分代码写错,将button⼜写成sysMessage不能显⽰在线⼈数查找侦听线程,启动客户端发现抛出异常Cannot invoke “javax.swing.JTextField.setText(String)” because “this.textfield” is nulltextfield为空,查找问题源头;发现在构造⽅法中:the assignmen to variable has no effect;这是因为单词拼写错误,编译器并没有报错服务端退出时没有消息系统报错Cannot read field “input” because “node” is null意识到问题出在链表上,系统要求从0开始,⽽链表中的序号是从1开始的,修该链表中的findUser中的pos为0就解决写这个程序写了两天,直接废了~~到此这篇关于Java Socket实现聊天室附1500⾏源代码的⽂章就介绍到这了,更多相关Java Socket内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
JAVA网络编程-客户端Socket
JAVA⽹络编程-客户端Socket使⽤Socketsocket是两台主机之间的⼀个连接。
它可以完成7个基本操作:连接远程机器;发送数据;接收数据;关闭连接;绑定端⼝;监听⼊站数据;在绑定端⼝上接收来⾃远程机器的连接。
前4个步骤对应的4个操作⽅法应⽤于客户端(Socket),后⾯三个操作仅服务器需要(ServerSocket)⼀旦建⽴了连接,本地和远程主机就从这个socket得到输⼊流和输出流,使⽤者两个流相互发送数据。
连接是全双⼯的,两台主机都可以同时发送和接收数据。
数据的含义取决与协议,发送给FTP服务器的命令与发送给HTTP服务器的命令有所不同。
⼀般先完成某种协议握⼿,然后再具体传输数据。
当数据传输结束后,⼀端或两端将关闭连接。
有些协议,如HTTP1.0要求每次请求得到服务器后都要关闭连接。
⽽FTP或者HTTP1.1则允许在⼀个连接上处理多个请求。
public static void main(String[] args) throws Exception {try (Socket socket = new Socket("127.0.0.1", 8888)) {} catch (Exception e) {System.out.println(e);}}// 客户端使⽤setSoTimeout(int m)⽅法为连接设置⼀个超时时间,超时时间的单位是毫秒。
⼀旦打开Socket并设置其超时时间后,可以调⽤getInputStream()返回⼀个InputStream,⽤它从socket中读取⼦节。
⼀般来讲,服务器可以发送任意⼦节。
确认读取完毕后调⽤shutdownInput()⽅法关闭输⼊流。
public static void main(String[] args) throws Exception {try (Socket socket = new Socket("127.0.0.1", 8888)) {socket.setSoTimeout(1000);InputStream in = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String line = null;while ((line = br.readLine()) != null) {System.out.println(line);}socket.shutdownInput();} catch (Exception e) { System.out.println(e); } }// 客户端⽤Socket写⼊服务器getOutputStream();返回⼀个原始的OutputStream,可以⽤它从你的应⽤向Socket的另⼀端写数据。
java中的socket的native方法
【Java中的Socket的Native方法】一、引言Java作为一门跨评台的编程语言,广泛应用于网络编程领域。
而在网络编程中,Socket是一个重要的概念,它提供了一种机制,使得不同计算机之间可以进行通信。
在Java中,Socket的实现涉及到了native方法,这些方法是通过本地代码实现的,对于理解Socket的工作原理和性能优化是非常重要的。
本文将从深度和广度两个方面对Java中的Socket的native方法进行全面评估和探讨,并撰写一篇有价值的文章。
二、Socket的概念和作用在网络编程中,Socket是一种用于实现网络通信的编程接口。
它可以建立服务器和客户端之间的连接,并进行数据传输。
在Java中,Socket类提供了对通信端点的创建和操作,并且可以通过它来进行TCP和UDP通信。
三、Java中的Socket类Java中的Socket类是在包中提供的,它是网络编程的基本类之一。
通过Socket类,Java程序可以使用TCP协议进行网络通信。
在Socket类中,有一些native方法被用来实现底层的网络通信操作。
四、native方法的作用所谓的native方法,就是使用其他编程语言实现的方法,在Java中进行调用。
在Socket类中,一些复杂的网络通信操作需要调用底层的系统库来完成,因此使用native方法来实现这些操作是非常高效和灵活的。
五、native方法与Socket的性能由于native方法是通过本地代码实现的,因此它具有较高的性能。
在Socket的底层通信操作中,利用native方法可以充分发挥系统资源,提高通信效率和速度。
六、Java中Socket的native方法的问题和挑战尽管native方法在Socket的性能优化方面有很大的优势,但是它也存在一些问题和挑战。
跨评台兼容性、代码安全性等方面的考虑都需要进行充分的评估和处理。
七、总结和回顾通过对Java中Socket的native方法的深入探讨,我们可以更好地理解Socket的工作原理和性能优化。
java异步执行方法
Java异步执行方法一、什么是异步执行方法在计算机编程中,异步执行方法是指在调用某个方法后,不需要等待该方法执行完毕,而是立即返回结果,然后继续执行后续的代码。
异步执行方法可以提高程序的并发性和响应性,避免长时间的等待和阻塞。
二、为什么需要异步执行方法在处理一些耗时的任务时,传统的同步方法会导致程序在执行这些任务时被阻塞,无法进行其他操作。
而异步执行方法可以使得程序能够在执行这些耗时任务的同时,继续执行其他任务,提高了程序的效率和响应速度。
三、Java中的异步执行方法Java提供了多种方式来实现异步执行方法,以下是几种常用的方法:1. Java线程池Java线程池是一种管理和复用线程的机制,可以通过线程池来实现异步执行方法。
线程池中的线程可以并发执行多个任务,而不需要为每个任务创建一个新的线程。
使用Java线程池可以通过以下步骤来实现异步执行方法: - 创建一个线程池对象,指定线程池的大小和其他参数。
- 将需要异步执行的任务封装成一个Runnable或Callable对象。
- 将任务提交给线程池执行。
- 程序继续执行后续的代码。
2. Java FutureJava Future是一个接口,用于表示一个异步计算的结果。
通过Future对象可以获取异步计算的结果,或者取消异步计算。
使用Java Future可以通过以下步骤来实现异步执行方法: - 创建一个Callable对象,用于表示需要异步执行的任务。
- 将Callable对象提交给ExecutorService的submit方法,返回一个Future对象。
- 通过Future对象的get方法获取异步计算的结果,get方法会阻塞当前线程直到异步计算完成。
3. Java CompletableFutureJava CompletableFuture是Java 8引入的一个新特性,用于简化异步编程。
CompletableFuture提供了一种更加灵活和强大的方式来处理异步任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java中异步socket类的实现和源代码作者:dozb我们知道,java中socket类一般操作都是同步进行,常常在read的时候socket就会阻塞直到有数据可读或socket连接断开的时候才返回,虽然可以设置超时返回,但是这样比较低效,需要做一个循环来不停扫描数据是否可读。
看来,在同一个线程中,要是想实现异步读写不太容易。
下面介绍的这个类实现了伪异步socket通讯。
基本思想就是在现有socket类的基础上进行封装,当sock et连接建立成功后,立即创建一个socket数据接收线程,专门负责阻塞式的socket读取(read),而当前线程负责数据的发送(send)。
另外定义了一个接口,包括了socket的各种事件的回调。
我们要实现这个接口,在接口实现类中创建异步socket对象,并且传递接口类到异步socket对象中,目的是有socket事件的时候回调我们的方法。
下面是接口:SocketExHandler.javapackage ;import .*;/*** Title:* Description:* Copyright: Copyright (c) 2001* Company: * @author dozb* @version 1.0*//*** 异步Socket Client Interface* 使用方法:* 1.定义类 MySocketClientEx 实现SocketExHandler接口,实现 OnReceive OnClose OnConnect 事件* 2.在类中实现start方法 MySocketEx = new SocketEx(this,ip,port)* 3.在类中实现stop方法 delete MySocketEx* 4.当有数据到达时会触发OnReceive事件* 5.当对方SOCKET关闭时会触发OnClose事件* 6.当SOCKET建立时会触发OnConnect事件*//*** 异步Socket Server Interface* 使用方法:* 1.定义类 MySocketServerEx 实现SocketExHandler接口,实现 OnReceive OnListen OnClose OnAccept 事件* 2.在类中实现start方法 MySocketEx = new ServerSocketEx(this,ip,por t)* 3.在类中实现stop方法 delete MySocketEx* 4.当开始监听时会触发OnListen事件* 5.当SOCKET关闭时会触发OnClose事件* 6.当有客户端SOCKET要建立连接时会触发OnAccept事件*/public interface SocketExHandler{//当客户端sock数据到达时触发public void OnReceive(Object socket,byte buf[],int nLen);//当客户端sock连接建立成功时触发public void OnConnect(Object socket);//当服务端sock监听开始时触发public void OnListen(Object socket);//当服务端sock接受一个新的sock连接时触发public void OnAccept(Object socket,SocketEx ClientSocket) ;//当sock关闭时触发public void OnClose(Object socket);}下面是异步客户端socket类:SocketEx.javapackage ;import java.io.*;import .*;import java.util.*;import .SocketExHandler;/*** Title:* Description:* Copyright: Copyright (c) 2001* Company: * @author dozb* @version 1.0*/public class SocketEx implements Runnable{public static final boolean isdebug = true;//调试/***构造函数.*/public SocketEx(SocketExHandler seh,Socket ClientSocket){this. seh = seh;thisSocket = ClientSocket; InitNotify();}public SocketEx(SocketExHandler seh,String host,int port) thr ows IOException {this.seh = seh;thisSocket = new Socket(host,port);In itNotify();}public SocketEx(SocketExHandler seh, InetAddress address, int port ) throws IOException {this.seh = seh;thisSocket = new Socket(ad dress, port);InitNotify();}public SocketEx(SocketExHandler seh, String host, int port, I netAddress localAddr, int localPort ) throws IOException {this.seh = seh;thisSocket = new Socket(host,port,localAddr,localPort );InitNotif y();}public SocketEx(SocketExHandler seh, InetAddress address, int port, InetAddress localAddr, int localPort ) throws IOException {thi s.seh = seh;thisSocket = new Socket(address, port, localAddr,localPor t );InitNotify();}/*** 实现Socket的可见方法.*/public synchronized void close() throws IOException {IsRunni ng = false;thisSocket.close();}public InetAddress getInetAddress() {return thisSocket.getIne tAddress();}public InputStream getInputStream() throws IOException{return thisSocket.getInputStream(); }public InetAddress getLocalAddress() { r eturn thisSocket.getLo calAddress() ; }public int getLocalPort() { return thisSocket.getLocalPort() ; }public OutputStream getOutputStream() throws IOException{retu rn thisSocket.getOutputStream(); }public int getPort() { return thisSocket.getPort() ; }public int getSoLinger() throws SocketException{ return t hisSocket.getSoLinger(); }public synchronized int getSoTimeout() throws SocketException { return thisSocket.getSoTimeout(); }public boolean getTcpNoDelay() throws SocketException {return thisSocket.getTcpNoDelay(); }public void setSoLinger( boolean on, int val ) throws SocketE xception { thisSocket.setSoLinger(on,val); }public synchronized void setSoTimeout( int timeout ) throws S ocketException {thisSocket.setSoTimeout( timeout ) ; }public void setTcpNoDelay( boolean on ) throws SocketExceptio n {thisSocket.setTcpNoDelay(on); }public String toString() { return thisSocket.toString() ; }/*** 获取Socket*/public Socket GetSocket(){return thisSocket;}/*** 初始化异步Socket*/private void ShowMsg(String Msg){if(isdebug)System.out.println(Msg);}private void InitNotify(){if(NotifyThread != null) return ;try{biStream = new BufferedInputStream(getInputStr eam());thisSocket.setSoTimeout(0);}catch(IOException e){ShowMsg("InitNotify() IOException.");}IsRunning = true;NotifyThread = new Thread(this,"SocketEx_NoitfyThread ");NotifyThread.setDaemon(true);NotifyThread.start();if(seh !=null)seh.OnConnect(this);}/*** 关闭Socket*/private void Close(){try{close();}catch(Exception eclose){ShowMsg("Close() Exception.");}}protected void finalize() throws Throwable{Close();super.finalize();}/*** Thread 运行*/public void run(){while(IsRunning){try{if(getInputStream().read(buf,0,1) <= 0) //试读一个字节{DoClose();return ;}if(!DoReceive(getInputStream().availab le()))return ;}catch(Exception e){ShowMsg("run() Exception.");DoClose();return ;}try{Thread.sleep(0); //}catch(InterruptedException e){ShowMsg("run() InterruptedException. ");DoClose();return ;}}}/*** 当有数据到达时的回调方法.*/private boolean DoReceive(int nCanReadCount){try{int len = 0,nCurrReadCount=0,nStart=1;do{for(int i=nStart;i< BUFLEN;i++)buf[i]=0;if(nCanReadCount == 0){if(seh !=null)seh.OnReceive(this,buf, nStart);return true;}if(nCanReadCount >(BUFLEN-2)){nCurrReadCount = BUFLEN-2;}else{nCurrReadCount = nCanReadCount;}len = biStream.read(buf,nStart,nCurrRe adCount);if(len == 0){DoClose();return false;}nCanReadCount -= len;buf[len+nStart] = 0;if(seh !=null)seh.OnReceive(this,buf,len+nStart);nStart = 0;}while(nCanReadCount >0);}catch(Exception excpt){ShowMsg("DoReceive() Exception.");DoClose();return false;}return true;}/*** 当Socket建立连接时的回调方法.*/private void DoConnect(){if(seh !=null)seh.OnConnect(this);}/*** 当Socket关闭时的回调方法.*/private void DoClose(){try{if(IsRunning){Close();if(seh !=null)seh.OnClose(this);IsRunning = false;}}catch(Exception e){ShowMsg("DoClose() Exception.");}}/*** 以下实现不要改动!!!!*/private Thread NotifyThread=null;private boolean IsRunning = false;private Socket thisSocket = null;private static final int BUFLEN = 4097;private byte buf[] = new byte[BUFLEN];private BufferedInputStream biStream = null;private SocketExHandler seh=null;}下面是异步socketserver类:ServerSocketEx .javapackage ;import java.io.*;import .*;import java.util.*;/*** Title:* Description:* Copyright: Copyright (c) 2001* Company: * @author dozb* @version 1.0*/public class ServerSocketEx extends ServerSocket implements Runnable {/*** 以下实现不要改动!!!!*/public ServerSocketEx(SocketExHandler seh, int port ) throws IOException {super(port);this.seh = seh; Listen();}public ServerSocketEx(SocketExHandler seh, int port, int back log ) throws IOException {super(port,backlog);this.seh = seh; L isten ();}public ServerSocketEx(SocketExHandler seh, int port, int back log, InetAddress bindAddr ) throws IOException {super(port,backlog, b indAddr);this.seh = seh;Listen();}public void setTimeout(int timeout) {this.timeout = timeout;}public static Vector GetClientPool(){return ClientPool;};public static void CloseAllClients(){for(int i=0;i< ClientPool.size();i++){try{SocketEx s=(SocketEx)ClientPool.elemen tAt(i);if(s != null) s.close();}catch(Exception e){}}ClientPool.removeAllElements();}public static void PutClient(SocketEx s){ClientPool.addElemen t(s);};/*** 关闭Socket*/public void Close(){IsRunning = false;try{close();}catch(Exception eclose){}}protected void finalize() throws Throwable{Close();super.finalize();}* Thread 运行*/public void run(){while(IsRunning){acceptConnections();}DoClose();}// -------------------- Private methodsprivate void Listen() throws IOException{InitNotify();if(seh !=null)seh.OnListen(this);}/*** 初始化异步Socket*/private void InitNotify()throws IOException{if(NotifyThread != null) return ;try{setSoTimeout(this.timeout);} catch( IOException ex ) {IsRunning=false;throw ex;}IsRunning = true;NotifyThread = new Thread(this,"ServerSocketEx_Noitfy Thread");NotifyThread.setDaemon(true);NotifyThread.start();}/*** 当Socket关闭时的回调方法.private void DoClose(){try{if(seh !=null)seh.OnClose(this);//NotifyThread.stop();}catch(Exception e){}}private void processSocket(Socket s) throws IOException{SocketEx se = new SocketEx(seh,s);PutClient(se);if(seh !=null)seh.OnAccept(this,se);}private void acceptConnections() {try {if(IsRunning == false)return;Socket socket = acceptSocket();if(IsRunning != false && socket != null) {processSocket(socket);}} catch(Throwable e) {IsRunning = false;}}private Socket acceptSocket() {Socket accepted = null;try {if(IsRunning == true) {accepted = accept();if(IsRunning == false) {if(null != accepted) {accepted.close(); // rude, but un likely!accepted = null;}}}} catch(InterruptedIOException iioe) {// normal part -- should happen regularly so// that the endpoint can release if the server// is shutdown.// you know, i really wish that there was a// way for the socket to timeout without// tripping an exception. Exceptions are so// 'spensive.} catch (SocketException e) {if (IsRunning != false) {IsRunning = false;}} catch(Throwable e) {IsRunning = false;}return accepted;}private static final int TIMEOUT = 5000;private int timeout = TIMEOUT;private Thread NotifyThread=null;private boolean IsRunning=false;private SocketExHandler seh=null;private static Vector ClientPool=new Vector();}下面是几个工具类:TimerClient.javapackage com.ly.util;/*** TimerClient Interface** @version 1.0, 8 October 1995**/public interface TimerClient{void timerEvent(int id);}TimerCtl.javapackage com.ly.util;import java.util.Vector;import java.util.Enumeration;//import com.borland.jb.util.Diagnostic;/*** Timer Component** Note:* - The successful operation of this timer requires clients to exec ute simple, short* code snippets when called back by the engine. Otherwise the qu eue's delivery* mechanism will be held up** Further work:* - When Thread.Interrupt is implemented we can switch from the bus y wait model to* the calculated wait model. Without the interrupt the thread wa its for the* calculated interval before waking up. This is a problem if ano ther shorter* request arrives. For now we'll assume the minimum resolution o f the timer is* 100ms.** @version 1.0, 2 October 1995**/public class TimerCtl{static TimerTasks timerTasks;public TimerCtl() {}/** Start a timer running*/public static void startTimer(TimerClient client, int eventId, long delay, boolean repeat) {// create the timer if necessaryif (timerTasks == null) {timerTasks = new TimerTasks();timerTasks.start();}//Diagnostic.out.println("TIMER: startTimer"+eventId);// add the new task to the queuetimerTasks.add(client, eventId, delay, repeat);}/** Stop a timer*/public static void stopTimer(TimerClient client, int eventId) {//Diagnostic.out.println("TIMER: stopTimer"+eventId);if(timerTasks != null)timerTasks.end(client, eventId);}}class TimerTasks extends Thread{Vector tasks = new Vector();boolean suspended = false;boolean sleeping = false;/*** Thread task runner*/public void run() {// Loop foreverwhile (true) {long sleepTime = 0;// Ensure that the tasks class is protectedsynchronized (tasks) {//Diagnostic.out.println("TIMER: Tick");// Scan the job list for any jobs which may fire.// Mark one-shot jobs for deletion// Calculate the maximum time we can sleep forsleepTime = scan();// Delete DeletePending jobs. DeletePending jobs result from one-shots which have// been sent, and repeat jobs which have been cancelled. Job s may have been// cancelled during the Scan process.purge();}// Suspend timer if necessaryif (tasks.size() == 0) {//Diagnostic.out.println("TIMER: Suspend");try {synchronized(this) {suspended = true;wait();}}catch (InterruptedException e) {}}else {//Diagnostic.out.println("TIMER: Suggested Sleeping for "+sle epTime);if (sleepTime >= 0) {try {sleeping = true;sleep(sleepTime);sleeping = false;}catch (InterruptedException i) {//Diagnostic.out.println("TIMER: Caught me napping");}}}}}/*** Add a new task*/public void add(TimerClient client, int eventId, long delay, boolea n repeat) {TimerTask t = new TimerTask(client, eventId, delay, repeat);synchronized (tasks) {tasks.addElement((Object)t);}// Want instant response - wake the thread if it's napping// unfortunately the interrupt() method is not working// if (sleeping)// interrupt();if (suspended) {synchronized(this) {notify();//Diagnostic.out.println("TIMER: Resume");suspended = false;}}}/*** Find the job and mark it for deletion*/public void end(TimerClient client, int eventId) {synchronized (tasks) {for (int i = 0; i < tasks.size(); i++) {TimerTask t = (TimerTask)tasks.elementAt(i);//if (!t.deletePending && t.client == client && t.eventId == eventId)if (t.deletePending == false && t.client == client && t.event Id == eventId) {// JPBS - if we don't reset 'repeat', deletePending will be set againt.repeat = false;t.deletePending = true;break;}}}}/*** Clear out all the dead woodvoid purge() {for (int i = 0; i < tasks.size(); i++) {TimerTask t = (TimerTask)tasks.elementAt(i);if (t.deletePending) {//Diagnostic.out.println("TIMER: purged");tasks.removeElementAt(i);i--;}}}long scan() {// The value added to the current time determines the MAX time un til// the next scan// This is 100 now since thread.interrupt() is not implementedlong nextTime = System.currentTimeMillis() + 100;for (int i = 0; i < tasks.size(); i++) {TimerTask t = (TimerTask)tasks.elementAt(i);// if not already deletePending, test (and possibly send the ev ent)// as a result, the job may be flagged for deletion.// May also be a non-repeating job and so require self deletion if (!t.deletePending)t.test();// if the task didn't get deleted - see what it contributes to the timeif (!t.deletePending)nextTime = Math.min(nextTime, t.timeNext);//Diagnostic.out.println("TIMER: Scanning "+t.eventId+" "+(t.de letePending == true ? "DEL" : ""));return nextTime - System.currentTimeMillis();}}class TimerTask{TimerClient client;int eventId;long timePrev;long timeDelay;long timeNext;boolean repeat;boolean deletePending;public TimerTask(TimerClient client, int eventId, long timeDelay, b oolean repeat) {this.client = client;this.eventId = eventId;this.timeDelay = timeDelay;this.repeat = repeat;// schedule the next click - now + delaytimeNext = System.currentTimeMillis() + timeDelay;deletePending = false;//Diagnostic.out.println("TIMER: Adding New Task");}public void test() {if (System.currentTimeMillis() >= timeNext) {//Diagnostic.out.println("TIMER: fire");// Fire the eventclient.timerEvent(eventId);// Update the next timetimeNext = System.currentTimeMillis() + timeDelay;deletePending = !repeat;}}}下面是使用上面的异步socket类,做的demo开发DemoAppSocketHandler.javapackage ;import .*;import java.util.*;/*** Title:* Description:* Copyright: Copyright (c) 2001* Company: * @author dozb* @version 1.0*/public interface DemoAppSocketHandler{//当客户端sock有数据到达时触发public void OnProcessCmd(Object socket,String FromArea,String ToArea,String ChannNo,String MainFun,String SubFun,Vector ParamLis t);//当客户端sock连接建立成功时触发public void OnConnect(Object socket);//当服务端sock监听开始时触发public void OnListen(Object socket);//当服务端sock接受一个新的sock连接时触发public void OnAccept(Object socket,SocketEx ClientSocket) ;//当sock关闭时触发public void OnClose(Object socket);}DemoAppSocket.javapackage ;import java.io.*;import java.util.*;import com.ly.util.*;/*** Title:* Description:* Copyright: Copyright (c) 2001* Company: * @author dozb* @version 1.0*///这个类是异步socket 客户端和服务端的使用演示//对于客户端,实现了断开后自动连接//这个类是SocketExHandler 和 TimerClient 接口的实现public class DemoAppSocket implements SocketExHandler,TimerClient{//Sock构造函数public DemoAppSocket(DemoAppSocketHandler issh,boolean isServ er,String ip,int port) {this.issh = issh;this.isServer = isServer;this.ip = ip;if(this.ip == null) this.ip = "";this.port = port;if(this.port <0) this.port = 0;}//调用完构造后调用这个函数创建sock对象public void create(){if(!start())TimerCtl.startTimer(this,eventId,30*1000,true);}//这个方法一般不需要直接调用public boolean start(){if(this.isServer) return startServer(); else return s tartClient();}//停止socketpublic void stop(){TimerCtl.stopTimer(this,eventId);if(this.isServer) stopServer(); else stopClient();}//发送socket消息public boolean SendCmd(Object socket,String strCmd){SocketEx currSocketEx = (SocketEx)socket;if(!isServer && currSocketEx==null) currSocketEx = so cketEx;if(currSocketEx == null) return false;try{PrintWriter Sender = new PrintWriter(currSocketEx.getOutp utStream(),true);Sender.print(strCmd);Sender.flush();return true;}catch(Exception e){return false;}}//发送socket消息public boolean SendCmd(Object socket,String FromArea,String ToArea, String ChannNo,String MainFun,String SubFun,String Param){String strCmd = FromArea + ToArea + ChannNo + MainFun+SubFun+ "&"+Param+"&";return SendCmd(socket,strCmd);}//获得IP地址public String getIp(){return ip;}//获得端口号public int getPort(){return port;}protected boolean startClient(){if(socketEx != null) {try{socketEx.close();}catch(IOException e){};socketEx = null;}try{socketEx = new SocketEx(this,ip,port);TimerCtl.stopTimer(this,eventId);return true;}catch(IOException e){socketEx = null;}return false;}protected boolean startServer(){if(serverSocketEx != null) {try{serverSocketEx.close();}catch(IOException e){};serverSocketEx = null;}try{serverSocketEx = new ServerSocketEx(this,port); TimerCtl.stopTimer(this,eventId);return true;}catch(IOException e){serverSocketEx = null;}return false;}protected void stopServer(){if(serverSocketEx != null) {try{serverSocketEx.close();}catch(IOException e){};serverSocketEx = null;}}protected void stopClient(){if(socketEx != null) {try{socketEx.close();}catch(IOException e){};socketEx = null;}}public void timerEvent(int id){start();}static public String[] DealStr(String strS){int CMDHEAD_LEN = 22;String[] ret = new String[2];//0留下的字符串1完整的CMD ret[0]=strS;////假如只有一个&或没有&则不完整int FirstPos=strS.indexOf("&");if(FirstPos==-1)return ret;if(FirstPos != CMDHEAD_LEN-1){strS = strS.substring(FirstPos+1);return DealStr(strS);}int nSecondPos = strS.indexOf("&",FirstPos+1);if(nSecondPos<0)return ret;//可能格式不正确了if(strS.length()< CMDHEAD_LEN)return ret;ret[1] = strS.substring(0,nSecondPos+1);ret[0]=strS.substring(nSecondPos+1);return ret;}public void OnReceive(Object socket,byte buf[],int nLen){String ReceiveBuff = sReceiveBuf + (new String(buf,0,nLen));do//分解成单个的命令串{String strCmd[] = DealStr(ReceiveBuff);ReceiveBuff = strCmd[0];if(strCmd[1]==null || strCmd[1].equals("")) br eak;System.out.println(strCmd[1]);String FromArea=strCmd[1].substring(0,6);String ToArea=strCmd[1].substring(6,12);String ChannNo=strCmd[1].substring(12,15);String MainFun=strCmd[1].substring(15,18);String SubFun=strCmd[1].substring(18,21);String Param =strCmd[1].substring(22,strCmd[1]. length()-1);Vector ParamList=new Vector();int nLastPos=0;while(true){int nPos = Param.indexOf(",",nLastPo s);if(nPos <0){ParamList.add(Param.substring(n LastPos));// System.out.println(Param.substr ing(nLastPos));break;}String sParam = Param.substring(nLastP os,nPos);ParamList.add(sParam);// System.out.println(sParam);nLastPos = nPos+1;}DoProcessCmd(socket,FromArea,ToArea,ChannNo,Ma inFun,SubFun,ParamList);}while(true);sReceiveBuf = ReceiveBuff;if(sReceiveBuf == null) sReceiveBuf=null;}protected void DoProcessCmd(Object socket,String FromArea,String ToArea,String ChannNo,String MainFun,String SubFun,Vector ParamList) {if(issh !=null)issh.OnProcessCmd(socket,FromArea,ToArea,Chann No,MainFun, SubFun, ParamList);}public void OnConnect(Object socket){if(issh !=null) issh.OnConnect(socket);}public void OnListen(Object socket){if(issh !=null) issh.OnListen(socket);}public void OnAccept(Object socket,SocketEx ClientSocket) {if(issh !=null) issh.OnAccept(socket,ClientSocket);}public void OnClose(Object socket){notifyAll();TimerCtl.startTimer(this,eventId,30*1000,true);if(issh !=null) issh.OnClose(socket);}//SocketSocketEx socketEx = null;ServerSocketEx serverSocketEx=null;final int eventId = 1;String sReceiveBuf="";DemoAppSocketHandler issh=null;boolean isServer=false;String ip="127.0.0.1";int port=20000;}通过这种方式,可以高效地使用socket通讯,在异步socket版本没有发布以前,不失是一种解决问题的方法。