当前位置:首页 » 编程语言 » java异步socket

java异步socket

发布时间: 2022-08-03 21:23:56

A. java和其他语言异步SOCKET的问题

你需要补充自己的答案:你远程管理服务器可以在不重新启动它吗?您ulimit-a命令,当您每次启动tomcat,把打开的文??件的最大数量值设置为

的/ proc / sys目录/ FS /文件放到tomcat的启动脚本最大限制的总的系统,在sysctl.conf中决定。
获得的价值的ulimit当前用户打开的文件(包括套接字连接)允许的最大数量

使用ulimit-n命令目前只用于当前登录的后的值用户有效的系统重新启动或用户出口将失败。

如果你需要一个永久的,可以在/ etc / security / limits.conf中
格式说明符这个文件中的参数更详细的,如果你想设置为4096,您可以添加以下内容:

*软NOFILE 4096
*硬盘NOFILE 4096

如果你使用Linux的RedHat8的或9,在/ etc / pam.d / login文件登录文件中添加以下行
会议要求/ lib / security中/是pam_limits.so


会议要求在pam_limits.so

B. C#里有没有和java aio类似的异步非阻塞socket通信

1、关于异步:
java中异步请求就是*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
2、阻塞式I/O模型:默认情况下,所有套接字都是阻塞的。
一个输入操作通常包括两个不同阶段:
(1)等待数据准备好;(2)从内核向进程复制数据。
3、非阻塞式I/O: 进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把进程投入睡眠,而是返回一个错误。看看非阻塞的套接字的recvfrom操作如何进行

C. 用Java的socket编程实现c/s结构程序

今天太晚了,改天给你做一个,记得提醒我,这个如果只是要个简单的,我半个小时就搞定了

给我个邮箱

现在给贴出我的代码: 整个结构分两个工程
1。服务端工程NioServer.java: 采用nio 方式的异步socket通信,不仅可以实现你的服务器还可以让你多学习一下什么是nio
2。客户端工程UserClient.java: 采用Swing技术画了一个简单的UI界面,比较土,原因是我没那么多时间去设计界面,你需要的话可以自己去修改得漂亮点,相信不难

现在贴工程1:
package com.net;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NioServer {
public static final int SERVERPORT=5555;
public static final String USERNAME="wangrong";
public static final String PASSWORD="123456";
public static final String ISACK="ACK";
public static final String ISNAK="NAK!";
// Selector selector;//选择器
// SelectionKey key;//key。 一个key代表一个Selector 在NIO通道上的注册,类似主键;
// //取得这个Key后就可以对Selector在通道上进行操作
private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );// 通道数据缓冲区
public NioServer(){
}
public static void main(String[] args) throws IOException {
NioServer ns=new NioServer();
ns.BuildNioServer();
}
public void BuildNioServer() throws IOException{
/////////////////////////////////////////////////////////
///////先对服务端的ServerSocket进行注册,注册到Selector ////
/////////////////////////////////////////////////////////
ServerSocketChannel ssc = ServerSocketChannel.open();//新建NIO通道
ssc.configureBlocking( false );//使通道为非阻塞
ServerSocket ss = ssc.socket();//创建基于NIO通道的socket连接
//新建socket通道的端口
ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT));
Selector selector=Selector.open();//获取一个选择器
//将NIO通道选绑定到择器,当然绑定后分配的主键为skey
SelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT );
////////////////////////////////////////////////////////////////////
//// 接收客户端的连接Socket,并将此Socket也接连注册到Selector ////
///////////////////////////////////////////////////////////////////
while(true){
int num = selector.select();//获取通道内是否有选择器的关心事件
if(num<1){continue; }
Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {//遍历每个事件
try{
SelectionKey key = (SelectionKey)it.next();
//有一个新联接接入事件,服务端事件
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {
// 接收这个新连接
ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();
//从serverSocketChannel中创建出与客户端的连接socketChannel
SocketChannel sc = serverChanel.accept();
sc.configureBlocking( false );
// Add the new connection to the selector
// 把新连接注册到选择器
SelectionKey newKey = sc.register( selector,
SelectionKey.OP_READ );
it.remove();
System.out.println( "Got connection from "+sc );
}else
//读客户端数据的事件,此时有客户端发数据过来,客户端事件
if((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ){
// 读取数据
SocketChannel sc = (SocketChannel)key.channel();
int bytesEchoed = 0;
while((bytesEchoed = sc.read(echoBuffer))> 0){
System.out.println("bytesEchoed:"+bytesEchoed);
}
echoBuffer.flip();
System.out.println("limet:"+echoBuffer.limit());
byte [] content = new byte[echoBuffer.limit()];
echoBuffer.get(content);
String result=new String(content);
doPost(result,sc);
echoBuffer.clear();
it.remove();
}
}catch(Exception e){}
}
}
}

public void doPost(String str,SocketChannel sc){
boolean isok=false;
int index=str.indexOf('|');
if(index>0){
String name=str.substring(0,index);
String pswd=str.substring(index+1);
if(pswd==null){pswd="";}
if(name!=null){
if(name.equals(USERNAME)
&& pswd.equals(PASSWORD)
){
isok=true;
}else{
isok=false;
}
}else{
isok=false;
}
}else{
isok=false;
}
String result="";
if(isok){
result="ACK";
}else{
result="NAK!";
}
ByteBuffer bb = ByteBuffer.allocate( result.length() );
bb.put(result.getBytes());
bb.flip();
try {
sc.write(bb);
} catch (IOException e) {
e.printStackTrace();
}
bb.clear();
}

}

下面贴工程2
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class UserClient implements ActionListener{
JFrame jf;
JPanel jp;
JLabel label_name;
JLabel label_pswd;
JTextField userName;
JButton jb;
JPasswordField paswrd;
JLabel hintStr;
public UserClient (){
jf=new JFrame("XXX 登陆系统");
jp=new JPanel();
jf.setContentPane(jp);
jf.setPreferredSize(new Dimension(350,220));
jp.setPreferredSize(new Dimension(350,220));
jp.setBackground(Color.gray);
label_name=new JLabel();
label_name.setPreferredSize(new Dimension(150,30));
label_name.setText("请输入帐户(数字或英文):");
userName=new JTextField();
userName.setPreferredSize(new Dimension(150,30));
jp.add(label_name);
jp.add(userName);
label_pswd=new JLabel();
label_pswd.setPreferredSize(new Dimension(150,30));
label_pswd.setText("请输入密码:");
jp.add(label_pswd);
paswrd=new JPasswordField();
paswrd.setPreferredSize(new Dimension(150,30));
jp.add(paswrd);
jb=new JButton("OK");
jb.setPreferredSize(new Dimension(150,30));
jb.setText("确 定");
jb.addActionListener( this);
jp.add(jb);
hintStr=new JLabel();
hintStr.setPreferredSize(new Dimension(210,40));
hintStr.setText("");
hintStr.setForeground(Color.RED);
jp.add(hintStr);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private String name;
private String pswd;
public void actionPerformed(ActionEvent e) {
name=userName.getText().trim();
pswd=new String(paswrd.getPassword());
if(pswd==null){
pswd="";
}else{
pswd=pswd.trim();
}
if(name!=null && name.length()>0){
hintStr.setText("正在验证客户端,请稍候...");
start();
}
}

OutputStream os;
Socket s;
InputStream is;
public void start(){
//建立联网线程
new Thread(new Runnable(){
public void run() {
try {
s=new Socket("127.0.0.1",5555);
//写
os=s.getOutputStream();
os.write(name.getBytes());
os.write('|');//用户名与密码用"|"分隔
os.write(pswd.getBytes());
os.flush();
//读内容
Thread.sleep(1000);
is=s.getInputStream();
int len=is.available();
System.out.println("len:"+len);
byte[] bytes=new byte[len];
is.read(bytes);
String resut=new String(bytes);
System.out.println("resut:"+resut);
//TODO 这里通过返回结果处理
if(resut.equals("ACK")){
hintStr.setText("验证成功,欢迎光临!");
}else{
paswrd.setText(null);
hintStr.setText("用户名或密码错误,请重新输入");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
// try {
// os.close();
// is.close();
// s.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}
}).start();
}

public static void main(String[] args) {
new UserClient();
}

}

D. java 怎么实现http下的异步socket

packagecom.what21.httpserver.nio;
importjava.net.InetSocketAddress;
importjava.nio.channels.SelectionKey;
importjava.nio.channels.Selector;
importjava.nio.channels.ServerSocketChannel;
importjava.nio.channels.SocketChannel;
importjava.util.Iterator;
importjava.util.Set;
publicclassMyHttpServer{
/**
*启动服务
*
*@paramport
*@throwsException
*/
publicstaticvoidstartServer(intport)throwsException{
//创建选择器
Selectorselector=Selector.open();
//打开监听信道
ServerSocketChannelserver=ServerSocketChannel.open();
//与本地端口绑定
server.socket().bind(newInetSocketAddress(port));
//设置为非阻塞模式
server.configureBlocking(false);
//非阻塞信道才能够注册选择器,在注册过程中指出该信道可以进行Accept操作
SelectionKeyserverkey=server.register(selector,SelectionKey.OP_ACCEPT);
//反复循环,等待IO
while(true){
//取到选择器的监听事件
selector.select();
//取到通道内监听事件的集合
Set<SelectionKey>keys=selector.selectedKeys();
//遍历监听事件
for(Iterator<SelectionKey>it=keys.iterator();it.hasNext();){
SelectionKeykey=(SelectionKey)it.next();
//移出此事件
it.remove();
if(key==serverkey){
if(key.isAcceptable()){
//取到对应的SocketChannel
SocketChannelclient=server.accept();
if(client==null){
continue;
}
client.configureBlocking(false);
//在此通道上注册事件
client.register(selector,SelectionKey.OP_READ);
}
}else{
//处理{@linkSelectionKey#OP_READ}事件
SocketChannelclient=(SocketChannel)key.channel();
if(!key.isReadable()){
continue;
}
key.cancel();
newMyHandler(client).start();
}
}
}
}
/**
*@paramargs
*@throwsException
*/
publicstaticvoidmain(String[]args)throwsException{
startServer(8000);
}
}

packagecom.what21.httpserver.nio;
importjava.io.IOException;
importjava.nio.ByteBuffer;
importjava.nio.channels.SocketChannel;
importjava.nio.charset.Charset;
importjava.nio.charset.CharsetDecoder;
importjava.nio.charset.CharsetEncoder;
{
//编码
staticCharsetEncoderencoder=Charset.forName("GBK").newEncoder();
privateSocketChannelclient;
publicMyHandler(SocketChannelclient){
this.client=client;
}
@Override
publicvoidrun(){
try{
//==============================请求处理开始==============================
ByteBufferbuffer=ByteBuffer.allocate(1024);
client.read(buffer);
//将缓冲区准备为数据传出状态
buffer.flip();
CharsetDecoderdecoder=Charset.forName("GBK").newDecoder();
StringrquestStr=decoder.decode(buffer).toString();
System.out.println(rquestStr);
//==============================响应处理开始==============================
Stringhtml="<h1>HI~,MyHTTPServer!</h1>";
//响应头
StringBuildersb=newStringBuilder();
sb.append("HTTP/1.0200OK").append(" ");
sb.append("MIME_version:1.0").append(" ");
sb.append("Content_Type:text/html").append(" ");
sb.append("Content_Length:"+html.length()).append(" ");
sb.append(" ");
//响应内容
sb.append(html).append(" ");
sb.append(" ");
buffer=ByteBuffer.wrap(sb.toString().getBytes());
client.write(buffer);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
client.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}

E. Java Socket开发 关于报文传递和接收

看 Oracle 官方教程,同步式的 Socket 就是传统的一问一答方式,它就是你需要的。

客户端先 socket.getOutputStream().write(...); 之后到 socket.getInputStream().read(byte[]) 在循环中读取直到 read 方法返回 -1 或你期望的字节数已经全部收到了就停下来,如果不尝试停下来,后面的 read 将会阻塞等待。


http://docs.oracle.com/javase/tutorial/networking/sockets/index.html


基于性能改进,一般我们需要使用 NIO 异步的 socket,只需要一个线程负责通信,每个线程都有自己的出站消息队列和入站消息队列,以线程为 key 区分开,通信线程只负责把各自的消息从出站队列中发送去并把收到的消息放入入站队列中,应用程序线程就去各自的消息队列中取消息就可以了。因为每个应用线程有各自的消息队列,我们把消息放入出站队列之后就到入站队列上用同步锁等待的方法阻塞到有消息回答时为止。


关于 NIO non-blocking 非阻塞式 socket,下面有一个 NBTimeServer 例子,它讲的是服务端。客户端与此类似,

http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index.html


NIO 通信线程样例。

publicvoidrun()
{
inttip=0;
try
{
selector=Selector.open();
SelectionKeyk=channel.register(selector,getInterestOptions());
k.attach(thread);//把当前线程绑定到附件中。

this.running=true;
statusChanged(Status.CONNECTED);
while(this.isRunning())
{
//select()isablockingoperation.
inteventCount=selector.select();
debug("[MC.Debug]PollingTCPevents..."+eventCount);
if(eventCount>0&&channel.isOpen()&&this.isRunning())
{
Setkeys=selector.selectedKeys();
for(Iteratoriter=keys.iterator();iter.hasNext();iter.remove())
{
SelectionKeykey=(SelectionKey)iter.next();
Threadthread=(Thread)key.attachment();

if(!key.isValid())
{//channelisclosing.
break;
}
process(key);//处理读取消息并把消息放入thread对应的队列。//写出消息类似的,不过在register时需要注册写出允许的事件,

}
}
}
}

F. 关于java Socket的异步调用,思路问题,100元现金报酬

这样不就好了,不管服务器还是客户端,只要socket连接成功,就分别开启一个读线程,不停读取另一端数据,再开启一个写线程,比如从控制端读取的消息。在发送到另一端。

G. java中Socket的心跳包设置问题

使用一个线程进行监控,如果空闲一定时间就发送一个心跳包。对于异步Socket可以一个线程监控多个连接。

热点内容
黑漫的服务器ip 发布:2025-01-23 03:16:40 浏览:650
tplink无internet访问 发布:2025-01-23 03:15:18 浏览:566
原神用安卓手机玩为什么画质那么低 发布:2025-01-23 03:09:31 浏览:847
空调压缩机是外机吗 发布:2025-01-23 03:09:31 浏览:950
大学数据库学 发布:2025-01-23 02:54:30 浏览:588
部队营区监控系统录像存储多少天 发布:2025-01-23 02:49:26 浏览:523
oraclelinux用户名和密码 发布:2025-01-23 02:43:06 浏览:404
安卓手机主页滑动屏幕怎么设置 发布:2025-01-23 02:41:15 浏览:225
小脸解压 发布:2025-01-23 02:24:17 浏览:368
网易电脑版我的世界布吉岛服务器 发布:2025-01-23 02:20:17 浏览:985