Java Socket编程

简介:

对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会acceptSocket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。

       服务端代码

 

Java代码 public class Server {   

  1.     

  2.    public static void main(String args[]) throws IOException {   

  3.       //为了简单起见,所有的异常信息都往外抛   

  4.       int port = 8899;   

  5.       //定义一个ServerSocket监听在端口8899上   

  6.       ServerSocket server = new ServerSocket(port);   

  7.       //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的   

  8.       Socket socket = server.accept();   

  9.       //跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。   

  10.       Reader reader = new InputStreamReader(socket.getInputStream());   

  11.       char chars[] = new char[64];   

  12.       int len;   

  13.       StringBuilder sb = new StringBuilder();   

  14.       while ((len=reader.read(chars)) != -1) {   

  15.          sb.append(new String(chars, 0, len));   

  16.       }   

  17.       System.out.println("from client: " + sb);   

  18.       reader.close();   

  19.       socket.close();   

  20.       server.close();   

  21.    }   

  22.       

  23. }  

public class Server {    public static void main(String args[]) throws IOException {      //为了简单起见,所有的异常信息都往外抛      int port = 8899;      //定义一个ServerSocket监听在端口8899上      ServerSocket server = new ServerSocket(port);      //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的      Socket socket = server.accept();      //跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。      Reader reader = new InputStreamReader(socket.getInputStream());      char chars[] = new char[64];      int len;      StringBuilder sb = new StringBuilder();      while ((len=reader.read(chars)) != -1) {         sb.append(new String(chars, 0, len));      }      System.out.println("from client: " + sb);      reader.close();      socket.close();      server.close();   }   }

        

服务端从SocketInputStream中读取数据的操作也是阻塞式的,如果从输入流中没有读取到数据程序会一直在那里不动,直到客户端往Socket的输出流中写入了数据,或关闭了Socket的输出流。当然,对于客户端的Socket也是同样如此。在操作完以后,整个程序结束前记得关闭对应的资源,即关闭对应的IO流和Socket

 

       客户端代码

Java代码

  1. public class Client {   

  2.     

  3.    public static void main(String args[]) throws Exception {   

  4.       //为了简单起见,所有的异常都直接往外抛   

  5.       String host = "127.0.0.1";  //要连接的服务端IP地址   

  6.       int port = 8899;   //要连接的服务端对应的监听端口   

  7.       //与服务端建立连接   

  8.       Socket client = new Socket(host, port);   

  9.       //建立连接后就可以往服务端写数据了   

  10.       Writer writer = new OutputStreamWriter(client.getOutputStream());   

  11.       writer.write("Hello Server.");   

  12.       writer.flush();//写完后要记得flush   

  13.       writer.close();   

  14.       client.close();   

  15.    }   

  16.       

  17. }  

public class Client {    public static void main(String args[]) throws Exception {      //为了简单起见,所有的异常都直接往外抛      String host = "127.0.0.1";  //要连接的服务端IP地址      int port = 8899;   //要连接的服务端对应的监听端口      //与服务端建立连接      Socket client = new Socket(host, port);      //建立连接后就可以往服务端写数据了      Writer writer = new OutputStreamWriter(client.getOutputStream());      writer.write("Hello Server.");      writer.flush();//写完后要记得flush      writer.close();      client.close();   }   }

       

对于客户端往Socket的输出流里面写数据传递给服务端要注意一点,如果写操作之后程序不是对应着输出流的关闭,而是进行其他阻塞式的操作(比如从输入流里面读数据),记住要flush一下,只有这样服务端才能收到客户端发送的数据,否则可能会引起两边无限的互相等待。在稍后讲到客户端和服务端同时读和写的时候会说到这个问题。

本文转自杨海龙的博客博客51CTO博客,原文链接http://blog.51cto.com/7218743/1529869如需转载请自行联系原作者

IT达仁
相关文章
|
5天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
5天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
5天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第30天】本文将深入探讨Java并发编程的核心概念,包括线程安全、同步机制、锁优化以及性能调优。我们将通过实例分析如何确保多线程环境下的数据一致性,同时介绍一些常见的并发模式和最佳实践,旨在帮助开发者在保证线程安全的同时,提升系统的性能和响应能力。
|
2天前
|
Java 调度 开发者
Java 并发编程的探索与实践
【5月更文挑战第3天】在当今多核处理器普及的时代,并发编程已经成为提高程序性能的重要手段。本文将深入探讨 Java 并发编程的基本概念、原理及其在实际项目中的应用,帮助读者更好地理解和掌握 Java 并发编程技巧。
|
2天前
|
XML 监控 安全
18:面向切面编程-Java Spring
18:面向切面编程-Java Spring
19 5
|
3天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
17 4
|
3天前
|
并行计算 安全 Java
Java 并发编程的探索之旅
【5月更文挑战第2天】 在多线程的世界里,程序的行为变得错综复杂。本文将带您走进 Java 并发编程的核心概念,通过深入分析并发工具的使用和原理,帮助您构建高效、安全且响应迅速的应用程序。我们将探讨线程的基本知识,同步机制,以及高级并发工具如 Executors、Futures 和 Streams。通过理论与实践相结合的方式,为开发者提供一份清晰、实用的并发编程指南。
10 2
|
4天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第1天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细分析线程安全问题的根源,以及如何通过合理的设计和编码实践来避免常见的并发问题。同时,我们还将探讨如何在保证线程安全的前提下,提高程序的并发性能,包括使用高效的同步机制、减少锁的竞争以及利用现代硬件的并行能力等技术手段。
|
4天前
|
安全 Java 程序员
Java并发编程:理解并应用ReentrantLock
【4月更文挑战第30天】 在多线程的世界中,高效且安全地管理共享资源是至关重要的。本文深入探讨了Java中的一种强大同步工具——ReentrantLock。我们将从其设计原理出发,通过实例演示其在解决并发问题中的实际应用,以及如何比传统的synchronized关键字提供更灵活的锁定机制。文章还将讨论在使用ReentrantLock时可能遇到的一些挑战和最佳实践,帮助开发者避免常见陷阱,提高程序性能和稳定性。
|
4天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。