gpt4 book ai didi

Java套接字从客户端向服务器发送数据

转载 作者:行者123 更新时间:2023-12-02 04:15:54 24 4
gpt4 key购买 nike

为什么会出现NullPointerException?当我从服务器向客户端发送数据时,一切正常。

Error java.lang.NullPointerException
at NetworkClient.Klient.wyslijDane(Klient.java:35)

编辑代码我添加了完整的服务器类和客户端类在其他类中,我创建一个新的对象客户端和服务器

klient=new Klient();然后调用方法 WyslijDane。服务器没问题,客户端抛出异常。

客户端类

public class Klient {

public static final int PORT=50007;
public static Socket sock;
public static int msg=10;



public Klient() throws UnknownHostException, IOException
{
Socket sock=new Socket("localhost", PORT);
}



public static void wyslijDane(int GraczK) throws IOException
{

DataInputStream in=new DataInputStream(sock.getInputStream());
DataOutputStream out=new DataOutputStream(sock.getOutputStream());

// BufferedReader br=new BufferedReader(new InputStreamReader(System.in));



out.writeInt(GraczK);
//out.writeBoolean(flaga);
out.flush();
System.out.println("Wyslano dane "+ GraczK );
}
}

服务器类

 public class Server
{
public static final int PORT=50007;
public static MainWarSever main=new MainWarSever();
static Socket sock;
public Server() throws IOException
{
//tworzenie gniazda serwerowego
ServerSocket serv = null;
if (serv==null)
serv=new ServerSocket(PORT);
else
{
System.out.println("SErver już zajety brrrr");
serv.close();
}




sock=serv.accept();
System.out.println("Jest polaczenie: "+sock);

}


public static void wyslijDane(int GraczK) throws IOException
{
DataInputStream in=new DataInputStream(sock.getInputStream());
DataOutputStream out=new DataOutputStream(sock.getOutputStream());

boolean flaga=true;
int msg;
int i=0;
int msgOut;
msgOut=GraczK;
out.writeInt(msgOut);
out.writeBoolean(flaga);
out.flush();
System.out.println("Wyslano dane "+ GraczK + "Flage" + flaga);
}

最佳答案

1) 您收到 NullPointerException 因为当您说 sock.getOutputStream()sock.getInputStream() 您正在使用 socks 在构造函数外部声明的变量未初始化。

因此,不要在构造函数中创建新的 sock 变量,而是使用您已有的变量:

//Change this line
Socket sock=new Socket("localhost", PORT);

//To this
Socket sock=new Socket("localhost", PORT);

2) 您的 sock 变量不应声明为 static 并且 wyslijDane 应在执行构造函数(创建套接字)后调用,因此不应该保持静态。

3) 确保在创建 Socket 后调用 wyslijDane 方法。

4) 首先创建并刷新DataOutputStream,然后创建DataInputStream。它们在客户端和服务器代码中的顺序应该相同:

DataOutputStream out=new DataOutputStream(sock.getOutputStream());
out.flush();
DataInputStream in=new DataInputStream(sock.getInputStream());

既然您说创建 DataOutputStream 时会引发异常,那么问题应该得到解决。

<小时/>

建议:

最好不要在每次调用 wyslijDane 方法时都创建 DataOutputStreamDataInputStream。而是在创建套接字后立即创建 DataOutputStreamDataInputStream

关于Java套接字从客户端向服务器发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com