想做一个只接收数据的客户端,服务器是一个不断无条件发送数据的服务器,该怎么办?

cheluo5750 2017-09-04 09:23:15
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
// public static final String IP_ADDR = "58.32.247.2";//实际要用的服务器地址
// public static final String IP_ADDR = "localhost";//服务器地址
public static final String IP_ADDR = "127.0.0.1";
public static final int PORT = 5005;//服务器端口号

public static void main(String[] args) {
System.out.println("客户端启动...");
System.out.println("当接收到服务器端字符为 \"OK\" 的时候, 客户端将终止\n");
while (true) {
Socket socket = null;
try {
//创建一个流套接字并将其连接到指定主机上的指定端口号
socket = new Socket(IP_ADDR, PORT);

//读取服务器端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("请输入: \t");
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(str);

String ret = input.readUTF();
System.out.println("服务器端返回过来的是: " + ret);
// 如接收到 "OK" 则断开连接
if ("OK".equals(ret)) {
System.out.println("客户端将关闭连接");
Thread.sleep(500);
break;
}

out.close();
input.close();
} catch (Exception e) {
System.out.println("客户端异常:" + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.out.println("客户端 finally 异常:" + e.getMessage());
}
}
}
}
}
}

这是一个能连接本地服务器的代码,但我换上实际要用的ip,就不行了,刚入门,求大神教一下。
这个服务器只要客户端与之连接,就会不断地给客户端提供数据,是字符串形式的,需要解析,我现在只要能收到数据就好了。
...全文
532 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheluo5750 2017-09-12
  • 打赏
  • 举报
回复
谢谢各位大佬,我用socket套接字还是没有解决问题,不太懂。 不过我找到了一个用java写的telnet程序,要用到第三方包,能收到数据了,再次感谢各位大佬。
王瑞恒 2017-09-09
  • 打赏
  • 举报
回复
你可以试试 websocket不要用socke
pilnyun335857183 2017-09-08
  • 打赏
  • 举报
回复
在你的客户端代码里面加while循环读取吧,你现在只读了一个字符 try { while(true){ String ret = dis.readUTF(); System.out.println("服务器端: " + ret ); } } catch (IOException e) { e.printStackTrace(); }
cheluo5750 2017-09-08
  • 打赏
  • 举报
回复
主要问题是我取不出实验室服务器的数据,但是取我编的这个服务器的数据就能成功。7楼的服务器与客户端一起用就没问题,但是取实验室这种不停发送数据的服务器就不行,我不知道为什么。 而且奇怪的是telnet这个命令能取出来,而且也能取7楼我编的服务器的数据。
cheluo5750 2017-09-08
  • 打赏
  • 举报
回复
引用 8 楼 pilnyun335857183 的回复:
在你的客户端代码里面加while循环读取吧,你现在只读了一个字符 try { while(true){ String ret = dis.readUTF(); System.out.println("服务器端: " + ret ); } } catch (IOException e) { e.printStackTrace(); }
public class Client {
//    public static final String IP_ADDR = "58.32.247.2";//服务器地址
    public static final String IP_ADDR = "202.121.118.94";//实验室服务器地址
//    public static final String IP_ADDR = "localhost";
//    public static final String IP_ADDR = "127.0.0.1";
    public static final int PORT = 5005;//服务器端口号

    public static void main(String[] args) {
        System.out.println("客户端启动...");
        while (true) {
            Socket socket = null;
            try {
                //创建一个流套接字并将其连接到指定主机上的指定端口号
                socket = new Socket(IP_ADDR, PORT);

                while(true) {
                //读取服务器端数据
                DataInputStream input = new DataInputStream(socket.getInputStream());
    String ret = input.readUTF();
    System.out.println("服务器端: " + ret);

    // 如接收到 "OK" 则断开连接
    if ("OK".equals(ret)) {
        System.out.println("客户端将关闭连接");
        Thread.sleep(500);
        break;
    }
}
            }
            catch (Exception e) {
                System.out.println("客户端异常:" + e.getMessage());
            }
这样改? 也不行,看反应应该是连上了,但是数据弄不出来。
cheluo5750 2017-09-07
  • 打赏
  • 举报
回复
引用 4 楼 pilnyun335857183 的回复:
就是端口连接不上;你先ping下看看服务器能不能ping通,如果能ping通再确认下服务器上应用对应的端口是不是你要连接的5005。
谢谢大神! 我现在换了个服务器,ip 202.121.118.94 ,端口号5005, telnet 能通了,用cmd 连上之后会不断显示乱码,这些就是我要的数据,但是我写的java程序依然收不到数据,是不是程序有问题啊?我把ip设成本地,用自己的服务器发数据,能显示。但连这个 202.121.118.94 5005 的服务器却不能显示,但是用telnet命令是收得到数据的。 以下是程序: 客户端

public class Client {
//    public static final String IP_ADDR = "58.32.247.2";//服务器地址
    public static final String IP_ADDR = "202.121.118.94";//实验室服务器地址
//    public static final String IP_ADDR = "localhost";
    public static final int PORT = 5005;//服务器端口号

    public static void main(String[] args) {
        System.out.println("客户端启动...");
        while (true) {
            Socket socket = null;
            try {
                //创建一个流套接字并将其连接到指定主机上的指定端口号
                socket = new Socket(IP_ADDR, PORT);

                //读取服务器端数据
                DataInputStream input = new DataInputStream(socket.getInputStream());
                String ret = input.readUTF();
                System.out.println("服务器端: " + ret);
                // 如接收到 "OK" 则断开连接
                if ("OK".equals(ret)) {
                    System.out.println("客户端将关闭连接");
                    Thread.sleep(500);
                    break;
                }
                input.close();
            }
            catch (Exception e) {
                System.out.println("客户端异常:" + e.getMessage());
            }
            finally {
                        if (socket != null) {
                            try {
                                socket.close();
                            }
                            catch (IOException e) {
                                socket = null;
                                System.out.println("客户端 finally 异常:" + e.getMessage());
                            }
                        }
            }
        }
    }
}
服务器

public class Server {
    public static final int PORT = 5005;//监听的端口号
    public static void main(String[] args) {
        System.out.println("服务器启动...\n");
        Server server = new Server();
        server.init();
    }
    public void init() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                // 一旦有堵塞, 则表示服务器与客户端获得了连接
                Socket client = serverSocket.accept();
                // 处理这次连接
                new HandlerThread(client);
            }
        } catch (Exception e) {
            System.out.println("服务器异常: " + e.getMessage());
        }
    }

    private class HandlerThread implements Runnable {
        private Socket socket;
        public HandlerThread(Socket client) {
            socket = client;
            new Thread(this).start();
        }
        public void run() {
               try {
                   DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                   System.out.print("请输入:\t");
                   // 发送键盘输入的一行
                   String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
                   out.writeUTF(s);

                 out.close();
               }
               catch (Exception e) {
                   System.out.println("服务器 run 异常: " + e.getMessage());
               }
               finally {
                   if (socket != null) {
                       try {
                           socket.close();
                       }
                       catch (Exception e) {
                           socket = null;
                           System.out.println("服务端 finally 异常:" + e.getMessage());
                       }
                   }
               }

        }
    }
}
cheluo5750 2017-09-07
  • 打赏
  • 举报
回复
引用 4 楼 pilnyun335857183 的回复:
就是端口连接不上;你先ping下看看服务器能不能ping通,如果能ping通再确认下服务器上应用对应的端口是不是你要连接的5005。
C:\Users\DELL>ping 58.32.247.2 正在 Ping 58.32.247.2 具有 32 字节的数据: 来自 58.32.247.2 的回复: 字节=32 时间=5ms TTL=56 来自 58.32.247.2 的回复: 字节=32 时间=8ms TTL=56 来自 58.32.247.2 的回复: 字节=32 时间=6ms TTL=56 来自 58.32.247.2 的回复: 字节=32 时间=13ms TTL=56 58.32.247.2 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 5ms,最长 = 13ms,平均 = 8ms C:\Users\DELL>telnet 58.32.247.2 5005 正在连接58.32.247.2...无法打开到主机的连接。 在端口 5005: 连接失败 C:\Users\DELL> 这样显示是因为这个网址是通的,但是这个端口不通是吧?
专注于服务器 2017-09-06
  • 打赏
  • 举报
回复
俺也在学习java当中,每天 要学习的知识好多,希望俺能学出来 https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=5uqvqirt&productCode=vm&utm_source=5uqvqirt
pilnyun335857183 2017-09-06
  • 打赏
  • 举报
回复
就是端口连接不上;你先ping下看看服务器能不能ping通,如果能ping通再确认下服务器上应用对应的端口是不是你要连接的5005。
cheluo5750 2017-09-05
  • 打赏
  • 举报
回复
telnet 58.32.247.2 5005 之后显示 无法打开到主机的连接。在端口5005:连接失败。 是不是这样就代表无法连接到服务器?那用这种方法连百度等网站的ip也是显示同样的内容,是不是代表也连不上百度的服务器? 上面那些代码不对,这是一个服务器与客户端互通的例子,我的客户端只需要连上服务器,接收数据就行了,不用停止也不用向服务器发送数据;但我不知道怎么改,最近也一直在看,感觉弄个定时器一直循环接收数据就行了,而且我也不太清楚到底连没连上服务器,不太会判断;我们的服务器那台电脑一直开着,就在旁边连着网,按说我只要连着网就可以连接到它的啊,这个服务器处于初级开发阶段,发送数据没有任何限制,不用登陆啥的。
kobe8free 2017-09-05
  • 打赏
  • 举报
回复
先 telnet 58.32.247.2 5005 判断是不是ip端口是不是通的
pilnyun335857183 2017-09-05
  • 打赏
  • 举报
回复
连远端服务器不行的原因是什么,有异常信息吗?你可以先试试服务器端口能不能telnet上 或者是服务器端有验证什么的你没通过。 另外 客户端与服务器端之间的信息传递有什么规范吗或者说有没有定义应用层协议?没有协议直接往tcp连接上写字符的话会有粘包,拆包的问题的。具体就像你代码中读取的ret字符串本来是想获取一个"OK"但是得到的可能是 "其他信息OK" 或者 前次拿到"其他信息O"后面拿到"K" 这样。 如果有通信规范方面的文档给到你的话,最好先读懂文档。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧