黑马程序员技术交流社区

标题: 关于TCP服务端关闭的一点小问题 [打印本页]

作者: 邓杰    时间: 2012-6-11 09:21
标题: 关于TCP服务端关闭的一点小问题
/*
演示tcp传输。

1,tcp分客户端和服务端。
2,客户端对应的对象是Socket。
服务端对应的对象是ServerSocket。

*/

/*
客户端,
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。

需求:给服务端发送给一个文本数据。
步骤:
1,创建Socket服务。并指定要连接的主机和端口。
*/
import java.io.*;
import java.net.*;
class  TcpClient  
{
public static void main(String[] args) throws Exception
{
  //建立客户端连接并指定端口;
  Socket s=new Socket("192.168.1.100",1003);
  //获取Socket对象中的输出流,并向服务端传输数据;
  OutputStream out=s.getOutputStream();
  out.write("deng jie ni hao ".getBytes());
  //关闭客户端;因为输出流被封装在客户端中,所以只要关闭了客户;输出流也就自动关闭了;
  s.close();
}
}
/*
需求:接收客户端数据并打印在控制台上;
*/
class  TcpServer
{
public static void main(String[] args) throws Exception
{
  //建立服务端并监听一个端口;
  ServerSocket ss=new ServerSocket(1003);
  //通过accept获取连接过来的客户端的对象;并使用其方法;
  Socket s= ss.accept();
  //获取客户端的IP地址;
  String ip=s.getInetAddress().getHostAddress();
  System.out.println("ip="+ip+"....connected......");
  //获取客户端的读取流,并用读取流读取传过来的数据;
  InputStream in=s.getInputStream();
  byte[] buf=new byte[1024];
  int len=0;
  while ((len=in.read(buf))!=-1)
  {
   System.out.println(new String(buf,0,len));
  }
  //s.close();
  //ss.close();//自己写代码的时候忘记了写这两句话;在我的客户端发送完数据后怎么我的服务端还是关闭了。它是怎么做到的;
                           //毕老师说服务端一般不用关闭的;怎么才能让他一直开着;
}}

作者: 郑传庆    时间: 2012-6-11 10:12
我把你的接收端的类改成下面,接收端就可以一直着,第一个while里面的条件,自己可以重新定义。如果想要关闭的话,就需要判断。下面的意见仅供参考
public class TcpServer{
        public static void main(String[] args) throws IOException{
                // 建立服务端并监听一个端口;
                ServerSocket ss = new ServerSocket(1003);
                while (true) {
                        // 通过accept获取连接过来的客户端的对象;并使用其方法;
                        Socket s = ss.accept();
                        // 获取客户端的IP地址;
                        String ip = s.getInetAddress().getHostAddress();
                        System.out.println("ip=" + ip + "....connected......");
                        // 获取客户端的读取流,并用读取流读取传过来的数据;
                        InputStream in = s.getInputStream();
                        byte[] buf = new byte[1024];
                        int len = 0;
                        while ((len = in.read(buf)) != -1) {
                                System.out.println(new String(buf, 0, len));
                        }
                }
}
}
作者: 潘东升    时间: 2012-6-11 10:24
Socket s= ss.accept();
这个是一个阻塞式方法,等不到接收的对象就会一直等,如何一直等呢?接收一个服务请求后再回来等,就是无限循环的意思,所以用个while (true){ }把它括起来就行了,
作者: 邓杰    时间: 2012-6-11 10:42
哦。知道了谢谢。
这些东西毕老师的视频在什么时候会么讲到。为什么毕老师才就这个的时候要加这close这不是多此一举吗;
作者: 邓杰    时间: 2012-6-17 21:39
标题: RE: 关于TCP服务端关闭的一点小问题<已解决>
                                                
作者: 邓杰    时间: 2012-6-17 21:40
标题: 关于TCP服务端关闭的一点小问题<已解决>
  1. <已解决>
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2