分享
 
 
 

比尔学Java:Java Socket篇

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

比尔最近接到一个项目,是要在原来的系统上实现客户端与服务器的连接。原来的系统是用Java开发的,项目组讨后,决定应用Java提供的Socket类来解决问题。比尔是C开发的高手,对Java却只略知皮毛。所以,比尔一头扎进Java中,开始他的学习历程。当然,首先还要解决眼前的问题,学习Socket编程。

在学习Socket编程之前,先看看自己是否熟悉TCP、UDP、Ports等网络基本概念,要是还不熟悉的话就得先去补补课罗!

Socket 的基本概念

1、Socket,也就是俗称的套接字。

2、Sun Java中的定义:是运行在网络上的两个程序间双向通讯连接的末端,它提供客户端和服务器端的连接通道。Socket绑定于特定端口这样TCP层就知道将数据提供给哪个应用程序。

3、字面上的理解,Socket的意思是"插座、孔",你还可以把它形象地理解为打电话用的电话机,你从听筒里听到对方声音,同时将声音通过话筒传给对方。

我想你现在和我刚开始的时候一样:似乎有点明白,又似乎不是很明白,没关系,我希望通过下面例子的讲解你能够彻底地把握它。在实例之前,让我们先来看看Socket实现的基本原理。

Socket编程实现原理

从连接的建立到连接的结束,每个Socket应用都大致包含以下几个基本步骤:

1、服务器端socket绑定于特定端口,服务器侦听socket等待连接请求;

2、客户端向服务器和特定端口提交连接请求;

3、服务器接受连接,产生一新的socket,绑定到另一端口,由此socket来处理和客户端的交互,服务器继续侦听原socket来接受其他客户端的连接请求;

4、连接成功后客户端也产生一socket,并通过它来与服务器端通讯(注重:客户端socket并不与特定端口绑定);

5、接下来,服务器端和客户端就通过读取和写入各自的socket来进行通讯。

注重:本文中只讲解基于TCP的Socket应用

Java中的Socket类

Java中提供两个类(在java.net包中)——Socket和ServerSocket来分别实现客户端和服务器端Socket。但Socket的实际工作是由抽象类SocketImpl的实例来完成的,这其实是设计模式中Abstract Factory模式的一个应用。

ServerSocket类的常用构造器和主要方法:

ServerSocket(int port)在指定的端口号上产生一服务器端socket

Socket accept()

侦听socket,接受连接

Socket类的常见构造器和主要方法:

Socket(String host, int port)生成一socket并连接至指定的主机和端口

InputStream getInputStream()返回socket的输入流

OutputStream getOuputStream() 返回socket的输出流

一个客户服务器实例

了解了上面的一些基本知识以后,我想大家现在都迫不及待地想亲自动手编写自己的socket,那就让我们开始吧!在这个例子中,我们模拟了一个Echo服务,它侦听3333端口。客户端接受用户键盘输入并向服务器端发出连接请求,服务器端接受客户端连接,连接成功后建立会话,客户端于是向服务器端发送用户输入信息,服务器端接收此信息并且简单返回给客户端。源码如下:

(服务器端)

/**

* <p>Title:EchoServer.java </p>

* <p>Description: EchoServer create a echo-like server at port 3333</p>

* @author Mac

* @version 2002/9/2

*/

import java.net.*;

import java.io.*;

public class EchoServer

{

public static void main (String[] args) throws IOException

{

ServerSocket echoServer = null;

try

{

echoServer = new ServerSocket(3333); //creat a server socket at port

3333(问题一)

}

catch(IOException e)

{

System.err.println("Couldn't listen on port:3333");

System.exit(-1);

}

Socket echoClient = null;

try

{

echoClient = echoServer.accept(); //accept a connection

}

catch(IOException e)

{

System.err.println("IO error:" + e.getMessage());

System.exit(-1);

}

PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);

//gets the socket's output stream and opens a PrintWriter on it

//if you remove the argument true,what will happen?(问题三)

BufferedReader in = new BufferedReader(

new InputStreamReader(echoClient.getInputStream()));

//gets the socket's input stream and opens a BufferedReader on it

String strFromClient;

while((strFromClient = in.readLine()) != null)

{

out.println("result is :" + strFromClient);

}

in.close();

out.close();

echoClient.close();

echoServer.close();

}

}

(客户端)

/**

*<p>Title:EchoClient.java </p>

*<p>Description: EchoClient creates a socket thereby getting a connection to

echo-like server</p>

* @author Mac Wang

* @version 2002/8/30

*/

import java.net.*;

import java.io.*;

public class EchoClient

{

public static void main(String[] args)

{

try

{

Socket echoClient = new Socket("yourhostname",3333);

//creat a new socket connected to host and port 3333

PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);

BufferedReader in = new BufferedReader(

new InputStreamReader(echoClient.getInputStream()));

String fromServer,fromUser;

BufferedReader stdIn = new BufferedReader(

new InputStreamReader(System.in));

//gets the system input stream and opens a BufferedReader on it

while ((fromUser = stdIn.readLine()) != null)

{

if (fromUser.equals("bye")) break;

//when user types "bye" then end

System.out.println("input is:" + fromUser);

out.println(fromUser);

fromServer = in.readLine();

System.out.println(fromServer);

}

out.close();

in.close();

echoClient.close();

}

catch(UnknownHostException e)

{

System.err.println("Unknown host:yourhostname");

System.exit(1);

}

catch(IOException e)

{

System.err.println("I/0 error:" + e.getMessage());

System.exit(1);

}

}

}

现在大家可以分别运行Server和Client,看看程序运行效果(注重:你必须将yourhostname替换成你自己的主机名或IP地址)。并且思考以下几个问题:

1、把端口号换成2222后看看程序运行效果?那么89呢?是不是任何数字都可以呢?

2、假如不采用我们自己编写的echo server,而是连接到系统本身提供的echo server(端口号为7),试试看会发生什么情况,客户端Socket是否需要改变呢?

3、去掉PrintWriter中的参数True,看看程序运行的效果?

4、注重程序中是如何读取和写入Socket的?

5、试着多打开几个客户端,看看效果如何?

从问题5中大家可以看出来,上面的例子只支持一个用户连接,那么如何支持多用户的同时访问呢?最简单有效的方法就是利用多线程实现,每个线程对应一个用户连接,server接受一个client连接后,就新产生一个线程,并交由它去处理余下的工作。下面就是支持多用户的服务器端实现:

/**

*<p>Title:EchoMultiServer </p>

*<p>Description: EchoServer create a echo-like server at port 3333 which supports

multi-client</p>

* @author Mac Wang

* @version 2002/9/2

*/

import java.net.*;

import java.io.*;

class EchoMultiServerThread extends Thread

{

private Socket echoClient = nul

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有