黑马程序员技术交流社区

标题: TCP传输的小问题 - 技术分 [打印本页]

作者: 赵志勇    时间: 2012-5-23 20:14
标题: TCP传输的小问题 - 技术分
各位大虾,是不是建立tcp 的socket成功时,就可以自动的向目标地址发送数据??
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
  Socket s=new Socket("192.168.0.107",10003);
  OutputStream out=s.getOutputStream();
  out.write("哥们来了".getBytes());
  s.close();
}
}
class TcpServer
{
public static void main(String[] args)throws Exception
{
  ServerSocket ss=new ServerSocket(10003);
  Socket s=ss.accept();
  InputStream in=s.getInputStream();
  byte[] buf=new byte[1024];
  int len=in.read(buf);
  System.out.println(new String(buf,0,len));
  String ip=s.getInetAddress().getHostAddress();
  System.out.println(ip+"....conect");
  s.close();
  ss.close();
}
}
这代码中的客户端没有发送的方法,请问它是怎么发送到服务端的??

作者: 8161776    时间: 2012-5-23 20:23
  1. class TcpClient
  2. {
  3. public static void main(String[] args) throws Exception
  4. {
  5.   Socket s=new Socket("192.168.0.107",10003);//在这里创建Socket的时候客户端就已经去访问服务端了,通过ip,端口号去访问
  6.   OutputStream out=s.getOutputStream();
  7.   out.write("哥们来了".getBytes());
  8.   s.close();
  9. }
  10. }
  11. class TcpServer
  12. {
  13. public static void main(String[] args)throws Exception
  14. {
  15.   ServerSocket ss=new ServerSocket(10003);//这里的端口号跟上面的要一致
  16.   Socket s=ss.accept();//这个是一个阻塞似方法,如果没人访问的话一直在这里停着,有人一访问就获取Socket开始执行下面的,
  17.   InputStream in=s.getInputStream();
  18.   byte[] buf=new byte[1024];
  19.   int len=in.read(buf);
  20.   System.out.println(new String(buf,0,len));
  21.   String ip=s.getInetAddress().getHostAddress();
  22.   System.out.println(ip+"....conect");
  23.   s.close();
  24.   ss.close();
  25. }
  26. }
  27. 这代码中的客户端没有发送的方法,请问它是怎么发送到服务端的??
复制代码

作者: 付左军    时间: 2012-5-23 20:31
Socket s=new Socket("172.168.1.124",10000)所传的参数就是要连接的服务端
作者: 麦田守望者0812    时间: 2012-5-23 20:36
通信原理首先启动服务端 ServerSocket ss=new ServerSocket(10003);
   Socket s=ss.accept();为一个阻塞时方法  当客户端执行Socket s=new Socket("192.168.0.107",10003);
时  客户端和服务端就建立了连接 两者之间 就可以进行数据间的传递了

作者: 彩虹    时间: 2012-5-23 21:05
TCP是面向连接的服务,它分服务端与客户端,在进行tcp通信之前,先必须经过四个步骤:
1.Socket和ServerSocket
2.建立客服端与服务端
3.建立连接后,通过Socket中的io流进行数据的传输
4.关闭socket
只有在客户端与服务端成功创建连接,形成通信通道后,才能进行数据的发送,而并非建立tcp 的socket成功时,就可以自动的向目标地址发送数据。
客户端向服务端 发送数据是按照下面的过程进行:
1.创建客户端的socket服务、指定目的主机和端口
         Socket s=new Socket("192.168.1.107",10003);
2.为了发送数据,客户端应该获取socket流中的输出流
                OutputStream out=s.getOutputStream();
                out.write("ecp ge men lai le".getBytes());
                s.close();
3.建立服务端socket服务,并监听一个端口
    ServerSocket ss=new ServerSocket(10003);
4.通过accept方法获取连接过来的客户端对象
    Socket s=ss.accept();
客户端与服务端是通过相同的端口来建立通信的,建立连接后,客户端将要发送的数据写入到输出流中,服务端通过accept()方法获取连接过来的客户端对象。并通过客户端对象的读取流来读取对象,将流中的数据读出来

作者: 赵志勇    时间: 2012-5-23 21:10
万章云 发表于 2012-5-23 21:05
TCP是面向连接的服务,它分服务端与客户端,在进行tcp通信之前,先必须经过四个步骤:
1.Socket和ServerS ...

是不是只要向客户端的输出流中写入数据后,这些数据就传到服务端?如果不向输出流中写入数据就不能传到服务端呢?我的理解对吗?
作者: 彩虹    时间: 2012-5-23 21:26
赵志勇 发表于 2012-5-23 21:10
是不是只要向客户端的输出流中写入数据后,这些数据就传到服务端?如果不向输出流中写入数据就不能传到服 ...

      嗯!是的,因为一旦客户端与服务端建立连接后就相当于形成了一个管道,跟水管相似,正要有水源,管道的另一端就能取水,但也可能发生管道阻塞的状态
作者: 赵志勇    时间: 2012-5-23 22:13
万章云 发表于 2012-5-23 21:26
嗯!是的,因为一旦客户端与服务端建立连接后就相当于形成了一个管道,跟水管相似,正要有水源,管 ...

彻底明白,水管道真的很形象。谢谢啊。




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