事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的Api来完成这些工作,Socket就是其中之一。
对于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。
Java对这个模型的支持有很多种Api。而这里我只想介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持。事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你。
ServerSocket server=new ServerSocket(6789);
这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。
好了。我们有了固定位置。现在所需要的就是一根连接线了。该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持。只要客户方创建一个Socket的实例对象进行支持就可以了。
Socket client=new Socket(InetAddress.getLocalHost(),5678);
客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
好了,上面的方法基本可以建立一条连线让两台计算机相互交流了。可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。
否则数据的交互还是依赖于IO操作的。所以你也必须导入Java。io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。
BufferedReader in=new BufferedReader(new InputStreamReader (server.getInputStream())); PrintWriter out=new PrintWriter(server.getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作。而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了服务方:
import Java。io。*; import Java。net。*; public class MyServer { public static void main (String[] args) throws IOException { ServerSocket server=new ServerSocket(5678); Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader (client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true) { String str=in.readLine(); System。out。println(str); out。println("has receive..."); out。flush(); if(str。equals("end")) break; } client。close(); } }
这个程序的主要目的在于服务器不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。告知客户机已接收到消息。客户机代码:
import Java.net.*; import Java.io.*; public class Client{ static Socket server; public static void main(String[] args) throws Exception { server=new Socket (InetAddress.getLocalHost(),5678); BufferedReader in=new BufferedReader(new InputStreamReader(server。getInputStream())); PrintWriter out=new PrintWriter(server.getOutputStream()); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); while(true) { String str=wt.readLine(); out.println(str); out.flush(); if(str.equals("end")) { break; } System.out.println(in.readLine()); } server.close(); } }
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。这个程序只是简单的两台计算机之间的通讯。如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身。而服务器通过accept方法就是同意和客户建立通讯。这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯。那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:
服务器:
import Java.io.*; import Java.net.*; public class MyServer { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(5678); while(true) { Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true) { String str=in.readLine(); System.out.println(str); out.println("has receive..."); out.flush(); if(str.equals("end")) break; } client。close(); } } }
这里仅仅只是加了一个外层的While循环。这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息。那么现在就实现了多客户之间的交互了。
但是问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互。无法做到同时服务。那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。
那么下面的问题是如何使用线程。首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作。要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了。
而要执行线程就必须重写run方法。而run方法所做的事情。就是刚才单线程版本main所做的事情。因此我们的程序变成了这样:
import Java.net.*; import Java.io.*; public class MultiUser extends Thread { private Socket client; public MultiUser(Socket c) { this。client=c; } public void run() { try { BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); //Mutil User but can't parallel while(true) { String str=in.readLine(); System。out.println(str); out.println("has receive..."); out.flush(); if(str.equals("end")) break; } client.close(); }catch(IOException ex) { }finally { } } public static void main(String[] args)throws IOException { ServerSocket server=new ServerSocket(5678); while(true) { //transfer location change Single User or Multi User MultiUser mu=new MultiUser(server.accept()); mu.start(); } } }
我的类直接从Thread类继承了下来。并且通过构造函数传递引用和客户Socket建立了联系。这样每个线程就有了一个通讯管道。同样我们可以填写run方法。把之前的操作交给线程来完成。这样多客户并行的Socket就建立起来了。
本文来自:http://tech.ccidnet.com/art/297/20051223/399191_3.html
相关推荐
本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** Socket,又称为“套接字”,是网络通信中的一个抽象概念,它封装了IP地址和端口号,是网络通信链路的句柄。在Java中,Socket和...
在Java中,Socket编程是实现网络通信的基本手段,它允许应用程序之间通过网络进行数据交换。本文将详细探讨Java Socket网络编程中的关键知识点。 首先,我们回顾一下网络通信的发展历史。通信技术的发展经历了从...
在Java中,Socket编程涉及到的主要类和接口存在于`java.net`包中。 1. **ServerSocket**:在服务器端,你需要创建一个`ServerSocket`实例来监听特定端口上的连接请求。例如,`new ServerSocket(6789)`会打开6789...
本实例代码是为了配合博客文章,提供一个简单的Java Socket聊天室的实现,帮助读者更好地理解和应用Socket编程。 在Java Socket编程中,主要有两个核心概念:服务器端(Server)和客户端(Client)。服务器端通过...
### 三步学会Java Socket编程 #### 一、理解Socket概念与原理 ##### 1.1 套接字(Socket)定义 - **定义**:“套接字”(Socket)是一种用于描述IP地址和端口号的数据结构,它是网络通信的基础组件之一。简单来说...
本篇文章将深入讲解Java Socket编程的基础概念、原理以及实际应用,帮助你快速掌握这一关键技能。 一、Java Socket概述 Socket在计算机网络中扮演着桥梁的角色,它允许两个网络应用程序通过TCP/IP协议进行通信。在...
本篇文章将深入探讨Socket编程的基础知识,包括Socket类、ServerSocket类、连接建立与数据传输等关键概念。 1. **Socket类**: - Socket是Java中的一个类,代表TCP连接的一端,通常被称为客户端。它包含了IP地址和...
本篇文章将深入探讨Java中的Socket编程,并通过具体示例介绍如何使用Socket实现基于TCP协议的服务器与客户端之间的通信。 #### 二、Socket编程概述 Socket编程基于TCP/IP协议栈,主要分为客户端Socket编程和服务端...
在`Socket-master`这个文件夹中,可能包含了一个Java Socket编程的示例项目,用于演示如何在Nginx TCP转发场景下获取用户真实IP。该项目可能包括了服务器端和客户端的代码,通过分析和运行这些代码,我们可以更深入...
### Java Socket 编程:构建网络通信的基石 在当今高度互联的世界中,网络通信是软件开发中...通过本篇文章的学习,相信读者已经对Java Socket编程有了初步的了解和掌握,未来可以在此基础上进行更深入的研究和实践。
本篇文章将深入探讨Java Socket编程的基本概念、核心类、以及实际应用中的关键点。 一、Socket基本概念 Socket,通常被称为套接字,是进程间通信的一种方式,它允许不同计算机上的进程通过网络进行通信。在网络编程...
在深入了解Java中的Socket编程之前,我们需要对Socket有一个基本的认识。Socket可以理解为两个进程之间进行通信的一种通道,它可以基于不同的传输协议(例如TCP、UDP等)。其中,TCP是一种面向连接的、可靠的、基于...
本篇文章将深入探讨Java中的Socket编程,以及它在网络通信中的作用。 Java Socket编程是实现客户端(Client)与服务器端(Server)之间通信的基本手段。它基于TCP/IP协议,为应用程序提供了一种低级、可靠的、面向...
Java Socket通信程序源码是Java网络编程中一个重要的学习领域,它主要用于实现两台计算机之间的数据传输。在Java中,Socket是基于TCP/IP协议的一种低级通信机制,它提供了进程间网络通信的能力。本篇文章将深入探讨...
本篇文章将深入探讨Java和C如何进行Socket编程,并提供相关的实践示例。 首先,我们来了解Socket的基本概念。Socket可以被看作是网络上的端点,它允许应用程序发送和接收数据。在TCP/IP协议栈中,Socket基于传输层...
本篇文章将深入探讨Java Socket编程的基本概念、工作原理以及如何创建和使用Socket。 一、Java Socket概述 Java Socket提供了低级别的、面向连接的、基于流的通信服务,可以看作是应用程序间的通信管道。Socket分为...
Java Socket编程不仅局限于简单的数据传输,还可以应用于聊天室、文件传输、分布式系统等场景。 总的来说,Java Socket套接字是构建网络应用程序的关键工具,理解其工作原理和使用方式是Java开发者必备的技能。通过...
Java Socket和NIO(Non-blocking Input/Output,非阻塞I/O)是Java网络编程中的重要组成部分,它们在处理高并发、低延迟的网络服务时展现出强大的能力。本篇文章将深入探讨这两个概念,并通过示例代码`...
接下来,`Socket套接字—Java套接字编程(上1).chm`可能涵盖了Socket编程的基本概念和实践。这可能包括如何创建Socket对象,使用OutputStream和InputStream进行数据的读写,以及异常处理。此外,还可能讨论了多线程在...