當前位置:首頁 » 編程語言 » 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可以一個線程監控多個連接。

熱點內容
tomcat編譯後的文件 發布:2025-01-23 06:05:46 瀏覽:253
惠普暢遊人14是什麼配置表 發布:2025-01-23 05:57:39 瀏覽:295
簡單搭建ftp伺服器 發布:2025-01-23 05:49:41 瀏覽:227
有qq號沒密碼如何登上 發布:2025-01-23 05:34:08 瀏覽:469
javajsdes加密 發布:2025-01-23 05:33:21 瀏覽:770
qq怎麼上傳視頻到電腦上 發布:2025-01-23 05:07:27 瀏覽:972
如何申請i7伺服器地址 發布:2025-01-23 04:42:15 瀏覽:848
瀏覽器內核源碼 發布:2025-01-23 04:41:34 瀏覽:662
精英版繽智少了些什麼配置 發布:2025-01-23 04:41:30 瀏覽:359
編寫c編譯器 發布:2025-01-23 04:41:30 瀏覽:971