`

介绍Java Socket编程的文章

阅读更多

事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的Api来完成这些工作,Socket就是其中之一。

对于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。

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

ServerSocketserver=new
ServerSocket(
6789);

这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。

好了。我们有了固定位置。现在所需要的就是一根连接线了。该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持。只要客户方创建一个Socket的实例对象进行支持就可以了。

Socketclient=new
Socket(InetAddress.getLocalHost(),
5678);

客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作。而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了服务方:

importJava。io。*;
importJava。net。*;

publicclassMyServer
...{
publicstaticvoidmain
(String[]args)
throwsIOException
...{
ServerSocketserver
=new
ServerSocket(
5678);
Socketclient
=server.accept();
BufferedReader
in
=newBufferedReader(new
InputStreamReader
(client.getInputStream()));
PrintWriterout
=new
PrintWriter(client.getOutputStream());
while(true)
...{
Stringstr
=in.readLine();
System。out。println(str);
out。println(
"hasreceive...");
out。flush();
if(str。equals("end"))
break;
}

client。close();
}

}

这个程序的主要目的在于服务器不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。告知客户机已接收到消息。客户机代码:

importJava.net.*;
importJava.io.*;

publicclassClient...{
staticSocketserver;

publicstaticvoid
main(String[]args)
throwsException
...{
server
=newSocket
(InetAddress.getLocalHost(),
5678);
BufferedReaderin
=newBufferedReader(new
InputStreamReader(server。getInputStream()));
PrintWriterout
=new
PrintWriter(server.getOutputStream());
BufferedReaderwt
=newBufferedReader(new
InputStreamReader(System.in));

while(true)
...{
Stringstr
=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end"))
...{
break;
}

System.out.println(in.readLine());
}

server.close();
}

}

客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。这个程序只是简单的两台计算机之间的通讯。如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?

其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身。而服务器通过accept方法就是同意和客户建立通讯。这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯。那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

服务器:

importJava.io.*;
importJava.net.*;

publicclassMyServer
...{
publicstaticvoid
main(String[]args)
throwsIOException
...{
ServerSocketserver
=new
ServerSocket(
5678);
while(true)
...{
Socketclient
=server.accept();
BufferedReaderin
=newBufferedReader(new
InputStreamReader(client.getInputStream()));
PrintWriterout
=new
PrintWriter(client.getOutputStream());
while(true)
...{
Stringstr
=in.readLine();
System.out.println(str);
out.println(
"hasreceive...");
out.flush();
if(str.equals("end"))
break;
}

client。close();
}

}

}

这里仅仅只是加了一个外层的While循环。这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息。那么现在就实现了多客户之间的交互了。

但是问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互。无法做到同时服务。那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。

那么下面的问题是如何使用线程。首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作。要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了。

而要执行线程就必须重写run方法。而run方法所做的事情。就是刚才单线程版本main所做的事情。因此我们的程序变成了这样:

importJava.net.*;
importJava.io.*;

publicclassMultiUserextendsThread
...{
privateSocketclient;

publicMultiUser(Socketc)
...{
this。client=c;
}


publicvoidrun()
...{
try
...{
BufferedReaderin
=newBufferedReader(new
InputStreamReader(client.getInputStream()));
PrintWriterout
=new
PrintWriter(client.getOutputStream());
//MutilUserbutcan'tparallel
while(true)
...{
Stringstr
=in.readLine();
System。out.println(str);
out.println(
"hasreceive...");
out.flush();
if(str.equals("end"))
break;
}

client.close();
}
catch(IOExceptionex)
...{
}
finally
...{

}

}


publicstaticvoid
main(String[]args)
throwsIOException
...{
ServerSocket
server
=newServerSocket(5678);
while(true)
...{
//transferlocation
changeSingleUserorMultiUser
MultiUsermu
=newMultiUser(server.accept());
mu.start();
}

}

}

我的类直接从Thread类继承了下来。并且通过构造函数传递引用和客户Socket建立了联系。这样每个线程就有了一个通讯管道。同样我们可以填写run方法。把之前的操作交给线程来完成。这样多客户并行的Socket就建立起来了。

好了,上面的方法基本可以建立一条连线让两台计算机相互交流了。可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。

否则数据的交互还是依赖于IO操作的。所以你也必须导入Java。io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。

BufferedReaderin=new
BufferedReader(
newInputStreamReader
(server.getInputStream()));
PrintWriterout
=new
PrintWriter(server.getOutputStream());
分享到:
评论

相关推荐

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

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

    Java socket编程实例代码(Blog配套代码)

    Java socket编程实例代码,文章讲解可以参考我的blog

    基于Socket的java网络编程

    基于Socket的java网络编程, Socket通讯的过程 Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。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 Socket编程(五) 简单的WEB服务器

    文章来源:aspcn 作者:孙雯 简单的WEB服务器 一个简单的WEB服务器将由列表9.2这样构建.当然,还必须要对方法和回应事件进行改进.简单的服务器不会分析和存储请求头.新的WEB服务器将分析和存储请求,为以后的处理作...

    java并发编程教程源码

    软件资源:如数据库连接数、socket连接数等 --------------------- 作者:weixin_44416039 来源:CSDN 原文:https://blog.csdn.net/weixin_44416039/article/details/86000587 版权声明:本文为博主原创文章,...

    java网络编程学习资料

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

    Java 网络编程socket编程等详解

    本篇文章主要介绍了java网络编程中的类的方法以及实例,需要的朋友可以参考下

    Linux环境下基于TCP的Socket编程浅析.pdf

    论文摘要: Socket 适用于同一台...文章介绍了L inux 平台下的Socket 及其在TCP 协议下的编程原理, 并通过一个用Java 编写的基于 TCP 的客户ö服务器程序, 描述了网络中不同主机上的两个进程之间的 Socket 通信机制。

    java并发编程(好文)

    讲述java并发的好文章,从底层描述并发的实际机制,讲的比较深刻,高级咖啡啊建议一读

    Java学习材料(499篇文章)

    CLASSPATH详解;JAVA SOCKET编程;JAVA 编程技术中汉字问题。

    Socket套接字—Java套接字编程

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

    Java Socket编程(一) Socket传输模式

    文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫.所有的事情在到达时的顺序与它们出发时的顺序...

    Java Socket编程(三) 服务器Sockets

    文章来源:aspcn 作者:孙雯 服务器Sockets 列表9.2是一个服务器应用程序的一部分. 列表9.2 一个简单的服务器程序 /** * 一个监听端口并提供HTML文档的程序. */ class SimpleWebServer { public static ...

    Java Socket编程(四) 重复和并发服务器

    文章来源:aspcn 作者:孙雯 重复和并发服务器 这个应用程序被当作一个重复的服务器.因为它只有在处理完一个进程以后才会接受另一个连接.更多的复杂服务器是并发的.它为每一个请求分配一个线程,而不是来一个处理一...

    Java Socket编程(二) Java面向连接的类

    文章来源:aspcn 作者:孙雯 Java面向连接的类 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫.所有的事情在到达时的顺序与它们出发时的顺序...

    [Java]详解Socket和ServerSocket学习笔记

    即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求,这会,Socket对于我们来说就非常实用了。本篇文章主要介绍了Socket和ServerSocket,有兴趣的可以了解一下。

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]Java介绍 5. [目录]Java学习笔记(推荐) 6. [目录]JDBC文档 7. [目录]RMI 文档 2. [目录]Java资源(文档-书籍-下载-注册码) 1. [目录]License 和注册码 2. [目录]好书推荐 ...

Global site tag (gtag.js) - Google Analytics