Java 的Socket有沒有消息机制啊 Java中的实际情况是 监听线程阻塞,我想你也可以认为这算是一种Notify机制,因为该端口一有数据系统就会唤醒该监听线程。不过这意味着你需要启动上百个线程分别监听上百个Socket能问问为什么要监听上百个Socket吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以借用 Observer 和 Observable 这两个观察器完成 这个很简单,一个循环接受socket请求,当遇到请求,就创建一个线程处理添加到链表里 to:LDH202(玲海) 我要写一个程序接收并处理数百个终端传过来的数据﹐终端器是一个简单的仪器﹐每个终端内部集成有一个Server Socket,它有固定的端口号﹐只要给每个终端设置一个ip就可以用Socket连上去了 请教"在web页面上实现录音功能"? 由于我对Java并不太熟悉﹐能不能举个简单的例子啊﹐谢了 嗯,这是终端的条件限制了你的发挥那么,理论上你需要启动n个线程来分别负责每个终端的连接,并用read来等待Server的信息同时阻塞自己不过你也不用担心这会带来很大的负荷,一两百个监听线程还是没有问题的 Java 的Socket有消息机制,必须使用 NIO ,这就是基于消息机制的 Socket ,不使用线程机制.给你一个使用 NIO 的时间服务器的例子://file:TimeServer.javaimport java.io.*;import java.net.*;import java.nio.channels.*;import java.nio.*;import java.util.*;/** *一个使用 NIO 的时间服务器. */public class TimeServer { int port = 8001; Selector selector = null; ServerSocket serverSocket = null; ServerSocketChannel serverChannel = null; ByteBuffer message = ByteBuffer.allocate(1024); public TimeServer() { initServer(); } public TimeServer(int port) { this.port = port; initServer(); } public void initServer() { try { serverChannel = ServerSocketChannel.open(); serverSocket = serverChannel.socket(); serverChannel.configureBlocking(false); SocketAddress address = new InetSocketAddress(port); serverSocket.bind(address); selector = Selector.open(); serverChannel.register( selector, SelectionKey.OP_ACCEPT ); } catch (IOException ioe) { ioe.printStackTrace(); } } public void startServer() throws IOException{ while(true) { if(selector.select()==0) continue; Set readyKeys = selector.selectedKeys(); Iterator ite = readyKeys.iterator(); while (ite.hasNext()) { SelectionKey oneKey = (SelectionKey)ite.next(); if (oneKey.isAcceptable()) { Socket socket = serverSocket.accept(); SocketChannel clientChannel = socket.getChannel(); clientChannel.configureBlocking( false ); clientChannel.register( selector, SelectionKey.OP_WRITE ); ite.remove(); }else{ if (oneKey.isWritable()) { SocketChannel ch = (SocketChannel)oneKey.channel(); ite.remove(); message.clear(); message.put(GDateTime4DB.getDateString_Cn(new Date()).getBytes()); message.flip(); ch.write(message); oneKey.cancel(); ch.close(); } } } } } public static void main(String args[]) { TimeServer ts = new TimeServer(); try { ts.startServer(); } catch(IOException ioe) { ioe.printStackTrace(); } }} ibm dw开发者论坛有个nio教程。 基于Selector消息选择机制 消息到来的时候 都是无阻塞的 To abcdhy(程旭) 我想可能是我误解了楼主的意思,但是“小弟要写一个和上百个Server Socket连接的程序”应该是说,本地只能是客户端,需要主动的连接到上百个Server上,并等待Server的消息。而你的程序似乎是一个服务端不好意思,本人网络个不太是很懂,请稍微解释一下 TO stevenmo(凯) :怎么用这观察器啊?能不能说的具体点。 Socket下接收数据时Notify只能用NIO吗? 学习中 技术面试,分两次,那么第二次问哪些方面的呢? JSP页面如何处理用户名和密码? 线程Interrupt基础问题 得分好贴 jsf源代码分析之FactoryFinder的问题(在线等) 奇怪的问题 用struts 的中文乱码 问题 新建立的OFBIZ的群,大家一起讨论OFBIZ的问题 明明已经创建出一个session但是到别的servlet里面竟然获取不到 有关JAVA的applet el表达式读取request的list struts的例子怎么在tomcat上跑起来 JAVA上的探索。。。。。。
我要写一个程序接收并处理数百个终端传过来的数据﹐终端器是一个简单的仪器﹐每个终端内部集成有一个Server Socket,它有固定的端口号﹐只要给每个终端设置一个ip就可以用Socket连上去了
import java.io.*;
import java.net.*;
import java.nio.channels.*;
import java.nio.*;
import java.util.*;
/**
*一个使用 NIO 的时间服务器.
*/
public class TimeServer {
int port = 8001;
Selector selector = null;
ServerSocket serverSocket = null;
ServerSocketChannel serverChannel = null;
ByteBuffer message = ByteBuffer.allocate(1024);
public TimeServer() {
initServer();
}
public TimeServer(int port) {
this.port = port;
initServer();
}
public void initServer() {
try {
serverChannel = ServerSocketChannel.open();
serverSocket = serverChannel.socket();
serverChannel.configureBlocking(false);
SocketAddress address = new InetSocketAddress(port);
serverSocket.bind(address);
selector = Selector.open();
serverChannel.register( selector, SelectionKey.OP_ACCEPT );
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public void startServer() throws IOException{
while(true) {
if(selector.select()==0) continue;
Set readyKeys = selector.selectedKeys();
Iterator ite = readyKeys.iterator();
while (ite.hasNext()) {
SelectionKey oneKey = (SelectionKey)ite.next();
if (oneKey.isAcceptable()) {
Socket socket = serverSocket.accept();
SocketChannel clientChannel = socket.getChannel();
clientChannel.configureBlocking( false );
clientChannel.register( selector, SelectionKey.OP_WRITE );
ite.remove();
}else{
if (oneKey.isWritable()) {
SocketChannel ch = (SocketChannel)oneKey.channel();
ite.remove();
message.clear();
message.put(GDateTime4DB.getDateString_Cn(new Date()).getBytes());
message.flip();
ch.write(message);
oneKey.cancel();
ch.close();
}
}
}
}
}
public static void main(String args[]) {
TimeServer ts = new TimeServer();
try {
ts.startServer();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
我想可能是我误解了楼主的意思,但是
“小弟要写一个和上百个Server Socket连接的程序”
应该是说,本地只能是客户端,需要主动的连接到上百个Server上,并等待Server的消息。
而你的程序似乎是一个服务端不好意思,本人网络个不太是很懂,请稍微解释一下