`
zchening
  • 浏览: 14212 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一篇不错的介绍Java Socket编程的文章

阅读更多

      事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。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就建立起来了。

 

 

—————————————————–

 

<注>

 

文章来源:赛迪网《一篇不错的介绍Java Socket编程的文章

 

分享到:
评论

相关推荐

    一篇介绍 Java Socket 编程的经典文章

    一篇介绍 Java Socket 编程的经典文章.doc 一篇介绍 Java Socket 编程的经典文章.doc

    简单的socket编程java篇

    这是一个java的socket编程,简易实现了Server和Client的对话,由Client发出请求,Server返回服务器时间 纯粹练习作用

    java_socket(IBM)

    一篇来源于IBM的关于Java socket的好文章 1.1 Java socket . . . . . . . . . . . . . . . . 3 1.2 Java socket - 教程提示 . . . . . . . . 4 1.3 Java socket - 套接字基础 . . . . . 6 1.4 Java socket - 一个...

    基于Java的即时通讯工具的设计与开发的毕业设计,使用Java SE和Java Socket API开发基本功能

    这篇毕设将介绍一个基于Java的简单即时通讯工具的设计和开发过程。 ## 设计 在设计阶段,我们将考虑实现以下功能: 1. 用户登录和注册 2. 好友列表和聊天窗口 3. 单聊和群聊功能 4. 消息发送和接收 5. 图片和文件...

    java网络编程学习资料

    在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使用Network API操纵套接字,在完成本文后,你就可以编写网络低端通讯软件。  什么是套接字(Socket)?  Network API是典型的用于基于TCP/IP网络...

    Socket套接字—Java套接字编程

    用Java开发网络软件非常方便和强大,Java的这种力量来源于他独有的一套...在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使用Network API操纵套接字,在完成本文后,你就可以编写网络低端通讯软件。

    由浅入深学Java—基础、进阶与必做260题 高清pdf版

    第3篇讲解了Socket、JSP、Servlet等网络编程技术;第4篇介绍了一个综合案例,让读者有提高的机会。 《由浅入深学Java:基础、进阶与必做260题》是一本Java编程自学手册,读者可以跟随书的讲解,边学习边上机,最好...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    三、Java语言基础教程-Java NIO流篇 [第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    由浅入深学Java—基础、进阶与必做260题.pdf

    第3篇讲解了 Socket、JSP、Servlet等网络编程技术;第4篇介绍了一个综合案例,让读者有提高的机会。 本书是一本Java编程自学手册,读者可以跟随书的讲解,边学习边上机,**在学完一章后,独立 做出每章的习题,这样...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    在火狐插件中使用socket编程与java进行通信

    因为这个问题,我学习了一下在firefox addon中使用socket监听我的java请求,然后由我自己来调用firefox的tabs api进行tab页的管理。有兴趣的朋友可以看下!  首先要熟悉几个socket相关的核心xpcom组件  ...

    Java聊天应用程序 - 创建一个基本的即时聊天应用

    在这篇Java实战博客中,我们将详细介绍如何构建一个简单的聊天应用程序,包括以下内容: 项目概述 构建服务器端 构建客户端 实现消息传输 运行聊天应用程序 总结 我们将使用Java的Socket编程来实现服务器端和客户端...

    21天学通Java-由浅入深

    第一篇 基础篇 第1章 Java简介(精彩视频:33分钟) 21 1.1 Java的平台简介 21 1.2 安装工具包 22 1.2.1 下载JDK 22 1.2.2 安装JDK 24 1.2.3 查看与设置环境变量 25 1.2.4 JDK常用命令 27 1.2.5 Java各个目录含义 28...

    Java大数据培训学校全套教材--10)Socket

    "java大数据培训学校全套教材"系列课程由750集视频构成,基本就 是1)时下流行的java培训学校主流... 本门课程为"java大数据培训学校全套教材"系列课程的第十篇,学习TCP,UDP,URL类让大家对Socket编程打下好的基础。

    JAVA自学之路

    在这儿之后,你可以选择向J2ME、或者Java GUI、Socket编程等方向努力,但是通过第一篇的办法,你可以很容易就将这方向过滤掉(永远不要忘了我们是为了就业),好吧,暂时和它们诀别,还是向着J2EE的方向前进吧。...

    java自学之道

    第一篇 基础篇 第0章 JDK安装和最简单的环境变量配置方法 第1章 Java基础概念 一、 Java基础语法 1、Helloworld.java 2、标识符 3、关键字 4、常量 5、变量 6、语句 6.1 if语句和switch语句 6.1.2 if语句举例 ...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    java 基于TCP协议的Socket编程和通信.doc Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL千万级的大表要怎么优化(读写分离、水平拆分、垂直拆分).doc redis缓存雪崩、缓存穿透、缓存预热、...

    TCP/IP协议与网络编程技术

    上篇主要介绍TCP/IP协议簇中的常用协议,下篇专门介绍网络编程知识与技能。 (2)具体在编写每一节的内容时将原理知识与实用技能融为一体。以方便读者学习。 (3)考虑到TCP/IP协议比较抽象,学习起来有一定的难度,...

    [14本经典Android开发教程]-7-Android编程入门教程

    [14本经典Android开发教程]-7-...10个C#Socket编程代码示例 http://download.csdn.net/album/detail/631 6份GDI+程序设计资源整合[全零分] http://download.csdn.net/album/detail/625 2014年移动游戏行业数据分析 ...

Global site tag (gtag.js) - Google Analytics