有什么好的方法让服务器socket监听数据更新呢

问题描述

服务端:packageSocketTest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.ServerSocket;importjava.net.Socket;publicclassServer{publicstaticvoidmain(String[]args){ServerSocketserver=null;try{server=newServerSocket(4700);}catch(IOExceptione){//TODOAuto-generatedcatchblockSystem.out.println("Cantlistento:"+e);}Socketsocket=null;try{socket=server.accept();}catch(IOExceptione){//TODOAuto-generatedcatchblockSystem.out.println("Error."+e);}Stringline;BufferedReaderis;try{is=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));System.out.println("Client."+is.readLine());line=sin.readLine();ThreadserverListener=newThread(newServerListener());serverListener.start();while(!line.equals("bye")){os.println(line);os.flush();System.out.println("Server:"+line);System.out.println("Client:"+is.readLine());line=sin.readLine();}os.close();is.close();socket.close();server.close();}catch(IOExceptione){System.out.println("Error."+e);}}}

客户端:packageSocketTest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;importjava.net.UnknownHostException;publicclassClient{publicstaticvoidmain(String[]args){try{//向本机的4700端口发出客户请求Socketsocket=newSocket("127.0.0.1",4700);//由系统标准输入设备构造BufferedReader对象BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由socket对象得到输入流,并构造PrintWriter对象PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));Stringreadline;readline=sin.readLine();while(!readline.equals("bye")){os.println(readline);os.flush();System.out.println("Client:"+readline);System.out.println("Server:"+is.readLine());readline=sin.readLine();}os.close();is.close();socket.close();}catch(IOExceptione){System.out.println("Error"+e);}}}

在测试的时候,客户端发送消息到服务端,第一次可以即时发送,第二次发送后,必须服务端返回消息给客户端才可以继续显示,有没有什么办法可以监听socket的数据变化?头大,各位大大赐教

解决方案

解决方案二:
这是Java老的Socket编程API,你看一下新的javaNIOAPI,里面已经用selector和监听机制了,且管道不仅仅是socket还有文件等channel类型,开发你的需求简单多了
解决方案三:
引用1楼qingyuan18的回复:

这是Java老的Socket编程API,你看一下新的javaNIOAPI,里面已经用selector和监听机制了,且管道不仅仅是socket还有文件等channel类型,开发你的需求简单多了

用老的可以搞定这个问题吗
解决方案四:
有朋友在吗?现在又遇到这个问题,很苦恼packageSocketTest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjava.util.List;publicclassServer{privatestaticList<Socket>sockes=null;privatestaticServerinstance;publicServer(){sockes=newArrayList<Socket>();}publicstaticvoidmain(String[]args){ServerSocketserver=null;try{server=newServerSocket(4700);}catch(IOExceptione){//TODOAuto-generatedcatchblockSystem.out.println("Cantlistento:"+e);}Socketsocket=null;try{while(true){socket=server.accept();Threadthread=newThread(newServerListener(socket));thread.start();System.out.println("NewThreadStarted");}}catch(IOExceptione){System.out.println("Error."+e);}}publicstaticvoidaddSocket(intposition,Sockets){sockes.add(position,s);}publicstaticvoidprint(Objecto){System.out.println(o);}publicstaticSocketgetSocket(intposition){returnsockes.get(position);}}

packageSocketTest;importjava.io.BufferedInputStream;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;publicclassServerListenerimplementsRunnable{privateSocketsocket=null;/**用来读取客户端发送的消息*/privateBufferedReaderis=null;/**用来给客户端发送消息*/privatePrintWriterout=null;/**客户端发送的消息*/privateStringline=null,SEND_OBJECT=null;/**用来保存Socket线程ID*/publicstaticintSocket_ID;/**用来给指定的其他客户端发送消息*/privatePrintWriteroutTo;/**保存初识信息**/privateStringtext;publicServerListener(Socketsocket){this.socket=socket;//System.out.println("Sorry");}@Overridepublicvoidrun(){try{is=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(socket.getOutputStream());text=is.readLine();System.out.println(text);Socket_ID=Integer.valueOf(newString(text.getBytes()).trim().split(",")[0]);SEND_OBJECT=newString(text.getBytes()).trim().split(",")[1];System.out.println(Socket_ID);Server.addSocket(Socket_ID,socket);outTo=newPrintWriter(Server.getSocket(Integer.valueOf(SEND_OBJECT)).getOutputStream());line=is.readLine();while(!line.equals("bye")){outTo.write(line);outTo.flush();Server.print("Client"+Socket_ID+":"+line);line=is.readLine();}}catch(IOExceptione){System.out.println("Error."+e);}}}

packageSocketTest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;importjava.net.UnknownHostException;publicclassClient{publicstaticvoidmain(String[]args){StringSEND_OBJECT="1";StringClient_ID="0";try{//向本机的4700端口发出客户请求Socketsocket=newSocket("127.0.0.1",4700);//由系统标准输入设备构造BufferedReader对象BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由socket对象得到输入流,并构造PrintWriter对象PrintWriteros=newPrintWriter(socket.getOutputStream());BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));os.println(Client_ID+","+SEND_OBJECT);os.flush();Stringreadline;readline=sin.readLine();while(!readline.equals("bye")){os.println(readline);os.flush();System.out.println("Client:"+readline);System.out.println("Client2:"+is.readLine());readline=sin.readLine();}os.close();is.close();socket.close();}catch(IOExceptione){System.out.println("Error"+e);}}}

解决方案五:
报空指针异常,不知道是哪里有问题。Exceptioninthread"Thread-0"java.lang.NullPointerExceptionatSocketTest.Server.addSocket(Server.java:45)atSocketTest.ServerListener.run(ServerListener.java:60)atjava.lang.Thread.run(UnknownSource)
解决方案六:
ServerSocketserver=null;这句下面加上instance=newServer();错误原因是你的sockes 没有被创建。
解决方案七:
你建立的是长连接,可以在客户端如果数据更新了发送一个更新指令,你的通讯可以按照一定的格式进行组织,方便解析,然后根据对应的指令做对应的操作。
解决方案八:
发送和接收数据应该是2个独立的线程。
解决方案九:
引用5楼cjh_tostring的回复:

ServerSocketserver=null;这句下面加上instance=newServer();错误原因是你的sockes 没有被创建。

这个在下面初始化了,这个问题已经搞定了,谢谢大家。
解决方案十:
引用1楼qingyuan18的回复:

这是Java老的Socket编程API,你看一下新的javaNIOAPI,里面已经用selector和监听机制了,且管道不仅仅是socket还有文件等channel类型,开发你的需求简单多了

你好,我最近在看NIO,遇到一些问题,可以帮帮我吗?感激不尽。ScatteringReads操作的时候,我写了一个228字节的文本,用一个ByteBuffer数组读取,header读完后输出没问题,到了下一个buffer就报BufferUnderflowException错误。packagenioTest;importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;publicclassChannelTest1{privatestaticByteBufferheader;privatestaticByteBufferbody;privatestaticFilefile;privatestaticRandomAccessFilera;privatestaticFileChannelinChannel;privatestaticlongbyteRead;publicstaticvoidmain(String[]args){file=newFile("d:"+File.separator+"text.txt");try{ra=newRandomAccessFile(file,"rw");inChannel=ra.getChannel();header=ByteBuffer.allocate(128);body=ByteBuffer.allocate(1024);ByteBuffer[]bufferArray={header,body};byteRead=inChannel.read(bufferArray);System.out.println(byteRead);//System.out.println(header.get(dst)());while(byteRead!=-1){header.flip();body.flip();while(header.hasRemaining()){byte[]dst=newbyte[128];header.get(dst);System.out.println(newString(dst));}header.compact();while(body.hasRemaining()){byte[]dst1=newbyte[128];body.get(dst1);System.out.println(newString(dst1));}byteRead=inChannel.read(bufferArray);}}catch(Exceptione){e.printStackTrace();}finally{try{ra.close();}catch(IOExceptione){e.printStackTrace();}}}}

时间: 2024-10-05 13:04:13

有什么好的方法让服务器socket监听数据更新呢的相关文章

我写的socket监听过一段时间就需要重新启动一下程序是什么原因

问题描述 我写的socket监听过一段时间就需要重新启动一下程序是什么原因 private void StartReceive() { string msg = null; IPEndPoint iep = new IPEndPoint(IPAddress.Parse(PublicVariables.BJIP), PublicVariables.PORT); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, Pr

怎么关掉socket监听

问题描述 环境linuxwas我的web应用部署在was下,有一个socket监听程序,启动时单独起了一个线程去启动socket监听,但是怎么才能在关闭web应用时将socket一起关掉呢?socket的进程是由was管理的,总不能每次重启应用都要把was重启了吧

c# 写web服务器 需要监听本机所有ip80端口

问题描述 用c#写web服务端想监听本机所有的ip的80端口机器有100多个ip想监听所有ip的80端口需要怎么实现呢serverSocket.Bind(newIPEndPoint(ipAddress,port)); 这个是监听的语句请高手指点 解决方案 解决方案二:机器有100多个IP??没见过这种服务器解决方案三:rawsocket?解决方案四:引用1楼Z65443344的回复: 机器有100多个IP??没见过这种服务器 有的...是租用的别人的服务器...就是要监听多个ip有什么办法么解决

求救,C#socket监听多个TCP连接时,怎么会经常中断?

问题描述 最近碰到一个难题,我在PC上用C#编写的服务器(OS是windowsXP),arm平台的linux去嵌入式系统作客户端,客户端一直发数据包到服务器,当客户端数量较少时socket连接不容易断,但有时也会断,当客户端数量多时(如1,20几台),它们之间的连接经常中断,服务器端会出现"远程强制关闭一个现有连接"的异常,客户端会出现通讯链路不可用的错误.奇怪的是用一台LinuxPC作服务器又没有类似的事情发生,不解,而且我在windows上用win32编的程序也会发生中断.请问各位

服务器socket接受多个客户端的连接以及接收数据的问题

问题描述 我现在的问题是,我服务器是C#写的socket监听,现在有多个客户端连接上来,服务器接受数据接收不到,(前面几次接收是正常的)代码如下:(1)服务器端publicstaticvoidsocketListener(){//服务器IP地址IPAddressip=IPAddress.Parse("10.0.1.81");//IPAddressip=IPAddress.Parse("10.0.1.80");SocketserverSocket=newSocket(

php中Socket创建与监听实现方法_php技巧

本文实例讲述了php中Socket创建与监听实现方法.分享给大家供大家参考.具体如下: 这里提供了在php中socket相关函数的一个实例,如创建Socket,接受一个socket连接 ,写入一个Socket及初始化连接等操作,具体实例代码如下: 复制代码 代码如下: $ip="127.0.0.1";          //定义ip地址 $port=1000;           //定义端口 $socket=socket_create(af_inet,sock_stream,sol_

socket-负责监听端口的局部变量serverScoket在方法结束后,为什么还能继续监听端口?

问题描述 负责监听端口的局部变量serverScoket在方法结束后,为什么还能继续监听端口? 我在winform中的按钮点击事件中新建了一个局部变量serveScoket,开启监听,在方法结束后,我新建一个客户端连接仍然可以连接到服务器,这是为什么? private void btnStart_Click(object sender, EventArgs e) { Socket server = new Socket(AddressFamily.InterNetwork,SocketType.

急!!在手机客户端写个程序,起监听(拦截)作用的,有什么方法??

问题描述 在手机客户端写个程序,起监听作用的,有什么方法??具体:j2me手机客户端程序,要能监听从服务器发给手机某个端口的信息,然后根据信息再执行相应的操作(快速登入邮箱,绑定手机等)??感觉有点类似web应用程序里面的servlet..小弟是做j2se的..谢谢各位j2me的大哥大姐帮忙看看... 解决方案 解决方案二:首先,j2me程序在手机上不能在后台运行(只有在S60系统可以放到后台长期运行,其它大多数手机都不行),你这个监听会用处不大.第二,联通的GSM没有cmnet帐号,只能用cm

C#监听服务器的时候无法向服务器发送数据

问题描述 请教各位一个问题,我在写一个与服务器通信的程序时,需要不断地监听来自服务器的数据,同时客户端也要发送数据到服务器.监听服务器返回数据包的程序采用线程的方式实现,主要代码如下:try{TcpClientTcpClient=newTcpClient();TcpClient.Connect(IPAddress.Parse("202.102.1.112"),Int32.Parse("8888"));Streamstm=TcpClient.GetStream();i