我对Android系统是新手。我有一个客户端类,我的主要活动引用。client类将客户端套接字连接到充当服务器的外部设备,但是它从不将我试图发送的消息发送到服务器。我知道这不是连接,因为在创建套接字时,我将setKeepAlive()设置为true,当我试图发送消息时不会引发异常,socket.isconnected()返回true,如果我试图在发送消息之前连接套接字,它会引发“已经连接”的异常。我已经尝试用各种拖车、换行符和传输结束符来结束字符串消息,我正在刷新dataoutpstream,并且我有
<uses-permission android:name="android.permission.INTERNET" />
许可。我没有得到任何错误消息,我只是没有看到Wireshark中发送的请求,我的代码如下:
public class Client {
private static final String TAG = "Client";
private InputStream reader;
private DataOutputStream writer;
private Socket socket;
private SocketAddress endpoint;
private String sendMessage, recievedMessage, ip; // Request = iso8583.stISORequest;
private int port, bytesRead = -1;
private boolean messageSent = false,
messageRecieved = false;
ByteArrayOutputStream Bytearrayoutputstream;
byte[] response1 = new byte[ 512 ],
response2 = new byte[ 512 ];
public Client(String ip, int port) throws Exception {
setIp(ip);
setPort(port);
setSocket();
setIO();
}
private void setIp(String hostIp) throws Exception {
Pattern ipPattern = Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
Matcher ipMatch = ipPattern.matcher(hostIp);
if (!ipMatch.find()) {
throw new Exception("invalid ip format");
}
else
this.ip = hostIp;
}
private void setPort(int hostPort) throws Exception {
Pattern portPattern = Pattern.compile("[0-9]{4}$"); // contains exactly 4 digits
Matcher portMatch = portPattern.matcher(hostPort+"");
if (!portMatch.find()) {
throw new Exception("host port must be 4 digits from 0-9");
}
else
this.port = hostPort;
}
public void send() throws IOException {
/* // connection test is not needed
socket.connect(endpoint); // throws already connected exeption
*/
this.messageRecieved = false; // toogle to false so transaction is not wrongfully assummed to have been recieved from pinpad
byte [] request = this.sendMessage.getBytes(); //stRequest.getBytes();
writer.write(request);
writer.flush();
this.messageSent = true;
}
public void recieveMessage() throws IOException, InterruptedException {
this.messageSent = false; // toogle to false so the next transaction is not wrongfully assumed to have been sent to pinpad
StringBuilder stringBuilder = new StringBuilder();
while( ( bytesRead = reader.read( response1 ) ) != -1 )
{
Bytearrayoutputstream.write( response1, 0, bytesRead);
stringBuilder.append(Bytearrayoutputstream);
}
if(bytesRead == -1){
Log.i(TAG,"did not recieve");
response1[0] = (byte)(0x20);
response1[1] = (byte)(0x20);
}
int longitud = response1[1];
response2 = Arrays.copyOf(response1, longitud+2);
Log.i(TAG, "Respuesta 1 SimHost: " +toHex(response2));
this.recievedMessage = stringBuilder.toString();
if(!(recievedMessage == null) || !recievedMessage.isEmpty())
this.messageRecieved = true;
}
private void setSocket() throws IOException {
socket = new Socket();
int timeout = 15000;
endpoint = new InetSocketAddress(ip, port);
socket.connect(endpoint, timeout);
socket.setKeepAlive(true);
}
private void setIO() {
try {
writer = new DataOutputStream(socket.getOutputStream());
Bytearrayoutputstream = new ByteArrayOutputStream();
reader = socket.getInputStream();
}
catch (Exception e){
e.printStackTrace();
}
}
}
public class MainActivity extends AppCompatActivity {
Button btn;
EditText Ip, hPort;
String sHostIP = "",
iHostPort = "",
response = "";
Client client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Ip = (EditText) findViewById(R.id.Ip);
hPort = (EditText) findViewById(R.id.port);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View v) {
try {
sHostIP = Ip.getText().toString();
iHostPort = hPort.getText().toString();
}
logon();
} catch (Exception e) {
showToast(e.getMessage());
}
}
});
}
private void showToast(String message) {
Toast toast = Toast.makeText(getApplicationContext(),
message,
Toast.LENGTH_SHORT);
toast.show();
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void logon() throws Exception {
String message = "this is a message\n";
Thread emulator = new Thread(() -> {
try{
client = new Client(sHostIP, Integer.parseInt(iHostPort));
client.setSendMessage(message);
client.send();
Thread.sleep(32000);
if (client.getSendStatus() == true) {
try {
client.recieveMessage();
Thread.sleep(32000);
}
catch (Exception e){
response = "exception happened could not send message";
}
if(client.getRecievedStatus() == true && !client.getRecievedMessage().isEmpty())
response = client.getRecievedMessage();
else
response = "did not recieve a response";
} // if
else
response = "message was not sent";
client.closeAll(); // finalize
}
catch (Exception e){
e.printStackTrace();
}
runOnUiThread(()->{
showToast(response);
}); // inner thread
}); // outer thread
emulator.start();
} // logon
} // class
我看过类似的问题,我看到的所有答案都建议您以换行符、拖车、传输结束字符结束消息,使用同花顺,或者在清单中包括internet权限,我已经在做了。我用了PrintWriter,DataOutputStream,BufferedWriter,我把消息写成了字节,二进制字符串,UTF和ASCII字符数组,什么都没有,有人能告诉我我做错了什么吗?
问题是编码。这一行代码解决了它This.sendmessage.getBytes(StandardCharsets.iso_8859_1);
我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!
我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出
关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套
我也试图从Java服务器和Python客户机传输数据。我成功地将数据从客户端传输到服务器,但根本没有接收到数据。 在python客户机上,我有以下内容:(注意,这是在一个单独的线程中运行的) 如果这是成功的工作,输出将是客户端套接字值,等待服务器,然后得到一些数据。然而,它正陷入等待数据的困境。 这意味着套接字显然不是None,它正在等待缓冲区接收?我将接收缓冲区大小设置为1,以查看是否有任何数据
我有一个Python服务器使用unix数据报套接字连接与一个C客户端通信。下面的代码设置一个套接字,然后从客户端发送和接收一条消息。这个脚本在python 2.7中工作,但是,当在python 3中测试它时,对recv()的调用会超时等待来自客户端的消息。然而,客户端确实从服务器接收消息而没有问题。我已经用3.5.2和3.7.1在两台不同的机器上测试过了,结果相同。 更新:我添加了一个ioloop
我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput