Java中网络编程之TCP协议

发表于:2012-12-29 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:woshixuye    来源:51Testing软件测试网采编

  一、TCP的基本概念

  TCP是专门设计用于在不可靠的英特网上提供可靠的、端到端的字节流通信的协议,是一个面向连接的协议,TCP连接是字节流而非报文流。UDP和TCP各有65536个端口号互不影响。

  二、单线程服务端

  以下代码只能实现服务端和客户端的同步对话。服务端处理完一个客户端请求,才会处理另一个客户端请求。服务器端的输出效果是Client1阻塞20秒,Client2不会执行。必须等Client1阻塞结束之后,Client2才会执行。该例子可用来学习TCP的基本语法。

/**
 * TCP客户端1
 *
 * @author 徐越
 *
 */
public class Client1
{
 public static void main(String[] args) throws Exception
 {
  Socket socket = new Socket("127.0.0.1", 8821);
  OutputStream os = socket.getOutputStream();
  String msg = "我是徐越1";
  Thread.sleep(20000);
  os.write(msg.getBytes());
  os.flush();
  os.close();socket.close();
 }
}


/**
 * TCP客户端2
 *
 * @author 徐越
 *
 */
public class Client2
{
 public static void main(String[] args) throws Exception
 {
  Socket socket = new Socket("127.0.0.1", 8821);
  OutputStream os = socket.getOutputStream();
  String msg = "我是徐越2";
  os.write(msg.getBytes());
  os.flush();
  os.close();socket.close();
 }
}

/**
 * 单线程TCP服务端
 *
 * @author 徐越
 *
 */
public class Server
{
 public static void main(String[] args) throws Exception
 {
  // 创建端口为8821的TCP服务器端对象
  // 8821是服务器端的端口号而客户端从某端口A连到8821,端口A是随机的
  ServerSocket serverSocket = new ServerSocket(8821);
  while (true)
  {
   // 若无客户端发送请求则线程在此阻塞,方法不继续执行
   Socket socket = serverSocket.accept();
   System.out.println("connected");
   InputStream instream = socket.getInputStream();
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   int len = 0;
   byte[] buffer = new byte[1024];
   while ((len = instream.read(buffer)) != -1)
   {
    bos.write(buffer, 0, len);
   }
   instream.close();
   bos.flush();
   bos.close();
   String msg = bos.toString();
   System.out.println("客户端的IP:" + socket.getInetAddress().getHostAddress());
   System.out.println("客户端的端口:" + socket.getPort());
   System.out.println("客户端的信息:" + msg);
  }
 }
}

  执行结果

  connected
  客户端的IP:127.0.0.1
  客户端的端口:3775
  客户端的信息:我是徐越1
  connected
  客户端的IP:127.0.0.1
  客户端的端口:3787
  客户端的信息:我是徐越2

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号