gpt4 book ai didi

Java通信客户端/服务器

转载 作者:行者123 更新时间:2023-11-29 07:14:56 26 4
gpt4 key购买 nike

这是在我的客户端:

public static void logIn(String name, String pass) {
try {
Socket s = new Socket("localhost", 9000);
PrintStream out = new PrintStream(s.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out.print(name + "," + pass);
out.flush();
out.close();

System.out.println(in.readLine());

in.close();
s.close();
}
catch(UnknownHostException exp)
{
exp.printStackTrace();

}
catch(java.io.IOException exp)
{
exp.printStackTrace();
}
}

我的服务器中有这个:

 public static void main(String[] args){
boolean clientExists=false;
ArrayList<User> users = new ArrayList<User>();
users.add(new User("jmeno","heslo"));
ServerSocket ss;
try {
ss = new ServerSocket(9000);
while(true) {
clientExists=false;
Socket s = ss.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream out = new PrintStream(s.getOutputStream());
String xmlpacket="";
String pom;

while ((pom = in.readLine())!=null){
xmlpacket+=pom;
xmlpacket+="\n";
}

for(User us: users)
{
if(us.isUserNameAndPasswordRight(login, passwd))
{
out.print("user is connected");
out.flush();
clientExists=true;
}
}
}
if(clientExist != true)
out.print("bad login");
out.flush();
out.close();
in.close();
s.close();
}
catch(java.io.IOException exp)
{
System.out.println("chyba u socketu!");
}

这样工作可行吗?我无法让它工作,因为当尝试从服务器读取答案时客户端出现异常。

编辑:这是堆栈跟踪:

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at client.client.logIn(client.java:79)


at client.GUI.GUI.jMenuItem1ActionPerformed(GUI.java:379)
at client.GUI.GUI.access$5(GUI.java:367)
at client.GUI.GUI$5.actionPerformed(GUI.java:151)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

我做了几件事,所以把所有的代码都给了。

  • 稍后放置缓冲读取器,以可能防止阻塞。
  • 添加了编码,因此它不使用默认操作系统编码(不同操作系统上的客户端)。
  • 是否打印了 i.o.打印。
  • 自动冲洗。
  • 重要:没有 PrintStream,只有 PrintWriter。
  • xmlpacket 上没有循环;那是以后的代码。

    public static void logIn(String name, String pass) {
    try {
    Socket s = new Socket("localhost", 9000);
    //PrintStream out = new PrintStream(s.getOutputStream(), true, "UTF-8");
    PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true);
    out.println(name + "," + pass);
    out.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(
    s.getInputStream(), "UTF-8"));

    System.out.println(in.readLine());

    out.close();
    in.close();
    s.close();
    } catch (UnknownHostException exp) {
    exp.printStackTrace();

    } catch (java.io.IOException exp) {
    exp.printStackTrace();
    }
    }


    public static void main(String[] args) {
    ArrayList<User> users = new ArrayList<User>();
    users.add(new User("jmeno", "heslo"));
    ServerSocket ss;
    try {
    ss = new ServerSocket(9000);
    while (true) {
    Socket s = ss.accept();
    System.out.println("Accept...");
    BufferedReader in = new BufferedReader(new InputStreamReader(
    s.getInputStream(), "UTF-8"));
    PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true);
    String xmlpacket = "";
    String pom;

    pom = in.readLine();
    //while ((pom = in.readLine()) != null) {
    xmlpacket += pom;
    xmlpacket += "\n";
    //}
    int commaPos = xmlpacket.indexOf(',');
    int newlinePos = xmlpacket.indexOf('\n');
    String login = xmlpacket.substring(0, commaPos);
    String passwd = xmlpacket.substring(commaPos + 1, newlinePos);

    boolean clientExists = false;
    for (User us : users) {
    if (us.isUserNameAndPasswordRight(login, passwd)) {
    out.println("user is connected");
    clientExists = true;
    break;
    }
    }
    if (!clientExists)
    out.println("bad login");
    out.close();
    in.close();
    s.close();
    }
    } catch (java.io.IOException exp) {
    System.out.println("chyba u socketu!");
    }
    }

关于Java通信客户端/服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431550/

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