Java 是否可以在服务器上解码作为字节数组从客户端发送的字节?
我只是想测试通过TCP套接字连接发送字节,我知道这并不是真正的目的,但我只是想弄清楚这是否可行 我想做的是:Java 是否可以在服务器上解码作为字节数组从客户端发送的字节?,java,io,socketexception,Java,Io,Socketexception,我只是想测试通过TCP套接字连接发送字节,我知道这并不是真正的目的,但我只是想弄清楚这是否可行 我想做的是: 从客户端上的字符串获取字节 将其作为字节发送到服务器 获取服务器上的字节并将其解码回原始字符串 客户: package ByteClientServer; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.*; publ
- 从客户端上的字符串获取字节
- 将其作为字节发送到服务器
- 获取服务器上的字节并将其解码回原始字符串
package ByteClientServer;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class Client {
String hostAddress = "localhost";
int port = 1010;
public Client()
{
try {
Socket socket = new Socket(hostAddress, port);
String test = "hello"; //dycrypt bytes from this string on server side
byte[] byteArray = test.getBytes();
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.write(byteArray);
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Client();
}
}
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args)
{
String hostAddress = "localhost";
int port = 8080;
Socket socket = null;
String test = "hello"; //decode bytes from this string on the server
byte[] byteArray = test.getBytes();
try
{
socket = new Socket(hostAddress, port);
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.write(byteArray, 0, byteArray.length);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
服务器:
package ByteClientServer;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args)
{
try
{
ServerSocket server = new ServerSocket(1010);
server.setSoTimeout(0);
Socket connectionToClient = server.accept();
InputStream is = connectionToClient.getInputStream();
DataInputStream dis = new DataInputStream(is);
byte[] data = dis.readUTF().getBytes();
//dis.readFully(data, 0, data.length);
String s = new String(data);
System.out.println(s);
}
catch(IOException e)
{
e.printStackTrace();
//System.err.println("Server was terminated.");
}
}
}
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws SocketException
{
try
{
ServerSocket server = new ServerSocket(8080);
server.setSoTimeout(0);
Socket connectionToClient = server.accept();
InputStream is = connectionToClient.getInputStream();
DataInputStream dis = new DataInputStream(is);
int buffersize = connectionToClient.getReceiveBufferSize();
byte[] bytes = new byte[buffersize];
if(dis.read(bytes) > 0)
{
String s = new String(bytes);
System.out.print(s);
}
dis.close();
server.close();
}
catch(IOException e)
{
e.printStackTrace();
System.err.println("Server was terminated.");
}
}
}
它不喜欢服务器上的这一行:
byte[]data=dis.readUTF().getBytes()
并抛出异常:
java.net.SocketException:在
java.net.SocketInputStream.read(未知源代码)位于
java.net.SocketInputStream.read(未知源代码)位于
java.io.DataInputStream.readFully(未知源代码)位于
位于的java.io.DataInputStream.readUTF(未知源)
位于的java.io.DataInputStream.readUTF(未知源)
ByteClientServer.Server.main(Server.java:21)
如果要使用
readUTF
,则需要使用writeUTF
。如果只想写入字节,则只需读取字节。您正在使用默认编码写入字节,然后将其作为UTF-8编码读取。这就是问题所在。
John Skeets的博客解释了如何调试这些错误和一些陷阱吗?我想出了一个简单的解决方法 客户:
package ByteClientServer;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class Client {
String hostAddress = "localhost";
int port = 1010;
public Client()
{
try {
Socket socket = new Socket(hostAddress, port);
String test = "hello"; //dycrypt bytes from this string on server side
byte[] byteArray = test.getBytes();
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.write(byteArray);
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Client();
}
}
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args)
{
String hostAddress = "localhost";
int port = 8080;
Socket socket = null;
String test = "hello"; //decode bytes from this string on the server
byte[] byteArray = test.getBytes();
try
{
socket = new Socket(hostAddress, port);
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.write(byteArray, 0, byteArray.length);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
服务器:
package ByteClientServer;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args)
{
try
{
ServerSocket server = new ServerSocket(1010);
server.setSoTimeout(0);
Socket connectionToClient = server.accept();
InputStream is = connectionToClient.getInputStream();
DataInputStream dis = new DataInputStream(is);
byte[] data = dis.readUTF().getBytes();
//dis.readFully(data, 0, data.length);
String s = new String(data);
System.out.println(s);
}
catch(IOException e)
{
e.printStackTrace();
//System.err.println("Server was terminated.");
}
}
}
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws SocketException
{
try
{
ServerSocket server = new ServerSocket(8080);
server.setSoTimeout(0);
Socket connectionToClient = server.accept();
InputStream is = connectionToClient.getInputStream();
DataInputStream dis = new DataInputStream(is);
int buffersize = connectionToClient.getReceiveBufferSize();
byte[] bytes = new byte[buffersize];
if(dis.read(bytes) > 0)
{
String s = new String(bytes);
System.out.print(s);
}
dis.close();
server.close();
}
catch(IOException e)
{
e.printStackTrace();
System.err.println("Server was terminated.");
}
}
}