Tag: 套接字

如何实现非阻塞IO?

在Java或C#或其他一些语言中,存在非阻塞IO设施,例如,用于套接字。 所以我可以将我的回调函数提供给非阻塞IO,一旦非阻塞IO收到任何东西,它就会调用我的回调函数。 我想知道它们是如何实施的。 如果我在场景后面创建非阻塞IO,Java或C#是否只为它们创建后台线程? 或OS底层有本机支持吗?

Java录制麦克风到字节数组和播放声音

我想用Java制作一个现场语音聊天程序,但我对Java中的录音/播放声音一无所知,所以在Google的帮助下,我想我已经能够从我的麦克风录制到一个字节数组,其中包含以下内容: AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true); TargetDataLine microphone; try{ microphone = AudioSystem.getTargetDataLine(format); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); microphone = (TargetDataLine)AudioSystem.getLine(info); microphone.open(format); ByteArrayOutputStream out = new ByteArrayOutputStream(); int numBytesRead; byte[] data = new byte[microphone.getBufferSize()/5]; microphone.start(); int bytesRead =0; try{ while(bytesRead<100000){ //Just so I can test if recording my mic works… numBytesRead […]

什么是TCP窗口更新?

我正在为Java游戏制作我自己的自定义服务器软件(游戏和原始服务器软件是用Java编写的)。 没有任何协议文档可用,因此我不得不使用Wireshark读取数据包。 当客户端连接服务器时,它会以Gzip格式向其发送级别文件。 在发送级别的大约94个数据包中,我的服务器使用ArrayIndexOutOfBoundsException崩溃客户端。 根据原始服务器的捕获文件,它会在该点发送TCP窗口更新。 什么是TCP窗口更新,以及如何使用SocketChannel发送?

multithreading与客户端服务器程序

我正在尝试使用我一直在研究的客户端/服务器程序实现multithreading。 我需要允许多个客户端同时连接到服务器。 我目前有4个类:客户端,服务器,协议和处理线程的工作者。 以下代码是我对这些类的代码: SocketServer类: public class SocketServer { public static void main(String[] args) throws IOException { int portNumber = 9987; try ( ServerSocket serverSocket = new ServerSocket(portNumber); Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); ) { Thread thread = new Thread(new ClientWorker(clientSocket)); thread.start(); //start […]

来自C ++ Client的Java DataInputStream readInt()获得巨大价值

我怀疑这与字节序有关,但我不确定如何修复它。 我有一个C ++客户端告诉Java服务器它将要发送多少字节,Java服务器只在输入流上调用readInt()。 然后服务器继续读取其余数据。 目前,如果C ++服务器调用: char l = ‘3’; BytesSent = send( Socket, &l, 1, 0 ); 然后相应的Java方面是: int lBytesSent = m_InDataStream.readInt(); m_AckNack = new byte[lBytesSent]; m_InDataStream.read(m_AckNack) 字节lBytesSent往往是一个巨大的值,然后在创建数组时抛出一个exception(毫不奇怪) 只需打开C ++套接字: Socket = socket(AF_INET, SOCK_STREAM, 0); Option = 1000; setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char *) &Option, sizeof(Option)); server.sin_family = AF_INET; server.sin_port = htons(Port); server.sin_addr.s_addr = INADDR_ANY; […]

java BufferedReader特定长度返回NUL字符

我有一个TCP套接字客户端从服务器接收消息(数据)。 消息的类型长度(2个字节)+数据(长度字节),由STX和ETX字符分隔。 我正在使用bufferedReader来检索两个第一个字节,解码长度,然后从相同的bufferedReader再次读取适当的长度并将结果放入char数组中。 大多数时候,我没有问题,但是有些(收到的数千条信息中有1条),当试图从阅读器读取(长度)字节时,我只得到它的一部分,我的数组的其余部分被填充“ NUL“人物。 我想这是因为缓冲区尚未填充。 char[] bufLen = new char[2]; _bufferedReader.read(bufLen); int len = decodeLength(bufLen); char[] _rawMsg = new char[len]; _bufferedReader.read(_rawMsg); return _rawMsg; 我用几种迭代的方式解决了这个问题: 首先,我测试了我的数组的最后一个字符:如果它不是ETX,我会逐个读取bufferedReader中的字符,直到我到达ETX,然后重新启动我的常规例程。 结果是我基本上会丢弃一条消息。 然后,为了仍然检索该消息,我会在我的“截断”消息中找到NUL字符的第一个出现,一次读取并存储一个附加字符,直到我到达ETX,并将它们附加到我的“截断”消息,确认长度是可以的。 它也有效,但我真的在想我能做得更好,比如在阅读之前检查缓冲区中我需要的字符总数是否可用,但找不到合适的方法… 任何想法/指针? 谢谢 !

UDP数据报中发送的消息未清理?

我的代码如下。 一切都按照我想要的方式工作,但是当收到我的消息时,他们有很多盒子,有点像这样的“消息:你好▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀“我怎样才能这样做才能收到和打印的只是”消息:你好“? 我非常感谢任何帮助。 import java.io.*; import java.net.*; public class UDPChat { public static void main(String args[]) throws Exception { new UDPChat(); } public UDPChat() { try { runChat(); } catch (Exception e) { }} public void runChat() throws InterruptedException { Sender sender = new Sender(); Receiver receiver = new Receiver(); sender.start(); receiver.start(); sender.join(); receiver.join(); […]

使用套接字和AsyncTask强制关闭

你好堆栈的人…. 请在下面查看我的课程代码和我的LogCat … 在尝试连接时,我正在关闭力量。 如果有人能帮助我弄清楚为什么会非常感激。 基本上代码正在做的是: 从意图中获取IP地址。 使用端口32连接到IP 然后发送命令,等待响应并发送另一个命令。 在我发送的2个命令后,我应该得到“SNX_COM>”的响应 建立连接后,我希望连接保持打开状态,以便在按钮单击时发送特定命令。 请帮忙 :) package com.smarte.smartipcontrol; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; public class IPControl extends Activity { private Socket socket; private […]

如何在java中通过套接字发送图像数据类型

我真的很困惑如何通过套接字发送图像数据类型。 请帮帮我。 我已经了解了如何将Image数据类型转换为char [],但结果为0。

从C客户端向Java服务器发送一个整数

我使用此代码从我的Java客户端向我的Java服务器发送一个整数 int n = rand.nextInt(50) + 1; DataOutputStream dos = new DataOutputStream(_socket.getOutputStream()); dos.writeInt(n); 我用这段代码在服务器上读了它 DataInputStream din = new DataInputStream(socket.getInputStream()); int ClientNumber= din.readInt(); System.out.println(ClientNumber); ClientNumber++; DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeInt(ClientNumber); String randomString= getRandomValue(10,20); dos.writeUTF(randomString); 它工作得很好,但现在我想写一个C客户端,我尝试了这段代码 #include #include #include #include #include #include #define SERVEURNAME “localhost” // adresse IP de mon serveur int to_server_socket = -1; void […]