`
panxq0809
  • 浏览: 296829 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Socket编程实例详解

    博客分类:
  • java
阅读更多
事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.

 

ServerSocket server=new ServerSocket(5678);
这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从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就建立起来了.
分享到:
评论

相关推荐

    Java socket编程实例.pdf

    ### Java Socket 编程实例详解 #### 一、引言 在现代软件开发中,网络编程占据了极其重要的地位。无论是互联网应用还是企业级系统,都需要处理不同设备间的通信。Java作为一种广泛使用的编程语言,提供了强大的...

    java socket 编程,Java socket 编程实例

    #### 三、Java中的Socket编程实例 接下来,我们通过一个简单的Java Socket编程示例来深入了解如何在Java中实现Socket编程。该示例展示了一个简单的Web客户端程序,用于获取一个HTML页面的内容。 ```java import ...

    Java网络socket编程详解

    Java网络socket编程是Java编程语言在网络编程中的一项核心技术,主要涉及到网络通信的两个基本概念:客户端(Client)和服务器(Server)。在Java中实现网络通信,主要依赖于Socket编程模型,尤其是基于TCP/IP协议的...

    Java使用socket网络编程详解

    在深入了解Java中的Socket编程之前,我们需要对Socket有一个基本的认识。Socket可以理解为两个进程之间进行通信的一种通道,它可以基于不同的传输协议(例如TCP、UDP等)。其中,TCP是一种面向连接的、可靠的、基于...

    Java网络socket编程详解1.docx

    本文将深入探讨Java中的Socket编程,包括TCP协议下的服务器和客户端实现。 首先,让我们理解Socket的基本概念。Socket,又称为套接字,是网络编程中两个进程间通信的一种端点。在TCP/IP模型中,Socket用于在不同...

    Java2编程详解.rar

    《Java2编程详解》这本书是Java开发者的重要参考资料,它涵盖了Java语言的核心概念和技术,旨在帮助读者深入理解并熟练掌握Java2平台的编程技术。在这个压缩包中,包含了一个名为"Java2编程详解.pdf"的PDF文件,这很...

    Java2编程详解(Special_Edition_Using_Java)

    网络编程也是Java2的重要部分,书中会介绍Socket编程和HTTP协议,使开发者能够创建网络应用和服务。此外,数据库连接(JDBC)和SQL语言的使用也是Java开发中的常见任务,书中会提供详细的指导。 Java 2还包括丰富的...

    Java Socket编程入门

    ### Java Socket编程入门知识点详解 #### 一、Java Socket编程基础概述 1. **平台无关性**:Java语言的一个显著特点就是平台无关性,这意味着编写的Java程序可以在任何支持Java虚拟机(JVM)的平台上运行。这对于...

    Java网络socket编程详解—有简单例子

    Java网络Socket编程是实现客户端与服务器之间通信的关键技术,它基于TCP/IP协议栈,提供了可靠的双向数据传输。本文将深入讲解如何使用Java进行Socket编程,包括面向套接字的编程思路,以及创建TCP协议的服务器和...

    三步学会Java Socket编程

    ### 三步学会Java Socket编程 #### 一、理解Socket概念与原理 ##### 1.1 套接字(Socket)定义 - **定义**:“套接字”(Socket)是一种用于描述IP地址和端口号的数据结构,它是网络通信的基础组件之一。简单来说...

    【Java socket编程】多人聊天室 源代码

    【Java Socket编程】多人聊天室源代码解析与详解 在IT行业中,网络编程是不可或缺的一部分,而Java Socket编程则是实现网络通信的基础。本教程将深入探讨如何使用Java Socket技术构建一个简单的多人聊天室,让我们...

    java Socket UDP实例详解

    Java Socket UDP实例详解 在Java中,Socket API不仅支持TCP(传输控制协议)通信,也支持UDP(用户数据报协议)。UDP是一种无连接的、不可靠的传输协议,适合于实时性要求高但数据完整性要求相对较低的场景。在本文...

    Java2编程详解

    9. **网络编程**:Java2提供了丰富的网络编程API,如Socket和ServerSocket,书中会讲解如何创建网络客户端和服务端应用程序。 10. **Java Applet和Swing**:作为Java的GUI(图形用户界面)开发工具,Applet和Swing...

    java2编程详解(special_edition_using_java)

    7. **网络编程**:介绍Socket编程,如何创建基于TCP/IP的客户端和服务器应用程序。 8. **Swing和AWT**:讲解Java的图形用户界面(GUI)开发,包括组件、布局管理器和事件处理。 9. **反射与注解**:探讨Java运行时...

    java socket编程

    ### Java Socket编程详解 在深入探讨Java Socket编程之前,我们首先理解一下Socket的基本概念及其在计算机网络中的作用。Socket,即套接字,是网络通信的一种接口,它为应用程序提供了访问底层传输协议(如TCP/IP)...

    java,socket实例

    Java Socket 实例与 JDBC 实例详解 在 Java 编程领域,Socket 和 JDBC 是两个非常重要的概念,尤其对于初学者和中级开发者来说,理解和掌握它们是提升技能的关键步骤。Socket 提供了网络通信的基础,而 JDBC 则是 ...

Global site tag (gtag.js) - Google Analytics