`
mmdev
  • 浏览: 13169456 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

JAVA socket编程基础讲解

 
阅读更多
事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.

Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.

ServerSocketserver=newServerSocket(6789);

这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.

Socketclient=newSocket(InetAddress.getLocalHost(),5678);
客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.

  1. BufferedReaderin=
  2. newBufferedReader(newInputStreamReader(server.getInputStream()));
  3. PrintWriterout=newPrintWriter(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编程

    在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...

    Java_TCPIP_Socket编程(中+英两本)

    中文版的《Java TCP/IP Socket编程》则针对国内读者的需求,以中文形式讲解了同样的概念和技术,帮助读者更好地理解和实践Java Socket编程。两本书结合阅读,能更全面地掌握这个领域的知识。 总之,Java TCP/IP ...

    java socket编程 服务器和客户端

    下面将详细讲解这个过程涉及的Java Socket编程知识点。 1. **Java Socket类**: Java中的Socket类代表了网络上的一个连接端点,它是Java网络编程的基础。`java.net.Socket`类用于创建客户端Socket,而`java.net....

    JAVA Socket远程执行任务

    以下是关于Java Socket编程和远程执行任务的详细知识讲解。 1. **Java Socket基础**: - Java Socket是Java提供的网络编程接口,它允许两个应用程序通过TCP/IP协议进行双向通信。 - Socket分为ServerSocket和...

    java3d socket编程

    在提供的文件中,《Java3D学习.doc》和《Java语言编程规范.doc》是关于Java3D和Java编程基础的文档,可能包含如何使用Java3D API以及编写高效、规范的Java代码的指导。《Socket教程.rar》则可能详细讲解了Socket编程...

    Java_TCP_IP_Socket编程(原书第2版)

    原书第二版深入浅出地讲解了Java Socket编程的各个方面,为开发者提供了全面的学习资源。以下是对Java TCP/IP Socket编程的一些关键知识点的详细说明: 1. **TCP/IP协议基础**:TCP/IP协议栈由四层组成,分别是应用...

    java socket 经典版本

    Java Socket编程是网络编程的基础,它是Java API提供的一种用于实现客户端-服务器通信的接口。在Java中,Socket类和ServerSocket类是进行网络通信的核心组件。这个经典版本可能包含了一系列关于如何有效使用Java ...

    Java Socket 实用教程

    6. **Java套接字编程**:Socket套接字—Java套接字编程(上1).chm可能深入讲解了Socket编程的具体步骤和实例,包括Socket的生命周期、连接管理和数据交换。 7. **TCP协议**:网络协议—Java网络编程之传输控制协议...

    java socket 中文教程

    本Java Socket中文教程旨在全面讲解Socket编程的核心概念和实践技巧,帮助开发者构建自己的网络应用程序。阅读HTML文档,你可以找到更多关于Socket编程的实例、代码示例和详细解释,以便更好地掌握这一技术。

    Java TCP_IP Socket编程源代码书籍以及附带源码

    通过学习这本书和实践源代码,开发者不仅可以掌握Java Socket编程的基本技能,还能深入了解网络通信的原理,为开发高可用、高性能的网络应用打下坚实的基础。无论是初学者还是有经验的开发者,都能从中受益匪浅,...

    java socket编程

    本篇文章将深入讲解Java Socket编程的基础概念、原理以及实际应用,帮助你快速掌握这一关键技能。 一、Java Socket概述 Socket在计算机网络中扮演着桥梁的角色,它允许两个网络应用程序通过TCP/IP协议进行通信。在...

    利用Socket进行Java网络编程.zip_java socket _java 网络编程_java 聊天_socket jav

    总的来说,Java Socket编程是构建网络应用的基础,它涵盖了网络通信的核心原理,通过学习和实践,你可以创建自己的聊天应用或其他基于网络的项目。记住,实践是最好的老师,动手编写代码并运行测试是掌握这项技能的...

    Java TCP-IP Socket编程-卡尔弗特.pdf

    Java TCP/IP Socket编程是网络通信领域中的核心技术,尤其在Java编程中,Socket是实现客户端与服务器之间通信的基础。本资料“Java TCP-IP Socket编程-卡尔弗特.pdf”旨在深入探讨如何利用Java语言进行TCP/IP套接字...

    java TCP/IP socket 编程(原书第2版)pdf+源码

    Java TCP/IP Socket编程是Java网络通信...总的来说,"java TCP/IP socket 编程(原书第2版)"是一本深入解析Java网络编程的书籍,通过阅读和实践,你将能够熟练掌握Socket编程,为构建稳定的网络应用程序打下坚实基础。

    《Java编程基础》电子教案

    11. **Java网络编程**:Socket编程基础,理解TCP和UDP协议,以及ServerSocket和Socket类的使用。 通过《Java编程基础》电子教案的学习,初学者不仅可以掌握Java语言的基本语法,还能了解到面向对象编程的思想,为...

    java socket通信自定义消息协议

    总的来说,Java Socket通信自定义消息协议涉及网络编程基础、数据结构设计以及异常处理等多方面知识。通过这个过程,我们可以灵活地构建满足特定需求的通信系统,实现客户端和服务器间的高效交互。

    《NIO与Socket编程技术指南》_高洪岩

    Socket编程是网络通信的基础,Java的Socket类和ServerSocket类提供了创建和管理网络连接的API。Socket用于建立客户端到服务器的连接,而ServerSocket则用于监听客户端的连接请求。Socket通信基于TCP/IP协议,确保...

    java socket查询数据库实现登录验证

    在Java编程领域,Socket通信是一种基础且重要的网络编程技术,常用于实现客户端-服务器应用程序间的双向通信。在这个特定的场景中,我们利用Java Socket来实现一个登录验证系统,该系统会通过查询数据库来验证用户的...

Global site tag (gtag.js) - Google Analytics