1、Socket简介

  在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

  在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。也就是说在Java环境下我们实现基于TCP/IP协议的网络编程需要采用Socket机制。Socket编程比基于URL的网络编程提供了更高的传输效率、更强大的功能和更灵活的控制,但是却要更复杂一些。由于Java本身的特殊性,Socket编程在Java中可能已经是层次最低的网络编程接口,在Java屮要直接操作协议中更低的层次,需要使用Java的本地方法调用 (JNI),在这里就不予讨论了。

Android中进行Socket编程与普通Java程序所进行的Socket编程的方式保持一致,不同的是数据的来源以及显示上有所区别。采用Java语言开发的一些网络编程的应用比如最经典的聊天室应用可以很容易地移植到Android平台上。而由于TCP协议要比UDP协议的应用广泛,如常用的HTTP、FTP、SMTP等协议都是采用TCP协议,因此这里主要介绍Android中基于 TCP协议的Socket编程。

Socket通常用来实现C/S结构。使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端监听某个端口是否有连接请求,Client端向Server端发出连接请求,Server端向Client端发回Accept (接受)消息,一个连接就建立起来了。Server端和Client端都可以通过Send、Write等方法与对方通信。Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。

2、Socket和ServerSocket

  在Java网络通信技术中,有一对非常般配的技术——Socket和ServerSocket

  网络编程可以分为创建Socket、打开连接Socket的输入流和输出流,对Socket进行编程,关闭Socket。

  ServerSocket用于服务器端,accept方法会返回一个客户端的Socket对象实例。这个时候服务器和客户端的连接就建立成功啦。

3、程序实现及效果:

客户端程序:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ConnectException;
import java.net.Socket; public class KeSocket
{
public static void main(String args[])
{
try
{
Socket s= new Socket("127.0.0.1",2007);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream(); PrintStream ps = new PrintStream(os);
ps.println("hello");
//DataInputStream dis = new DataInputStream(is);
//String request = dis.readLine();
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
String request = dis.readLine();
System.out.println(request);
s.close();
}
catch(ConnectException e)
{
System.out.println("异常"+e);
}
catch(IOException ee)
{
System.out.println("异常"+ee);
}
catch(Exception eee)
{
System.out.println("异常"+eee);
}
}
}

服务器端程序:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class ServerSocket1
{
public static void main(String args[])
{
try
{
ServerSocket ss = new ServerSocket(2007);
while(true) {
Socket s = ss.accept();
InputStream is= s.getInputStream();
OutputStream os= s.getOutputStream(); BufferedReader dis = new BufferedReader(new InputStreamReader(is));
String request = dis.readLine();
System.out.println(request);
PrintStream ps = new PrintStream(os);
ps.println("Bye");
s.close();
ss.close();
}
}
catch(IOException e)
{
System.out.println("异常"+e);
}
catch(Exception ee)
{
System.out.println("异常"+ee);
}
}
}

不打开服务器端,显然客户端连接失败:

异常java.net.ConnectException: Connection refused: connect

打开服务器端程序后,

服务器端显示:

hello
异常java.net.SocketException: Socket is closed

客户端显示:

Bye

4、多客户端连接

  在实际的应用中,往往有许多客户端向服务器发送请求,服务器会启动一个专门的服务线程来响应客户端的请求,同时服务器本省在启动线程之后,马上进入监听状态。

DuoServer.java 演示多客户请求服务器的过程,代码如下:

 import java.net.*;
import java.io.*;
public class DuoServer
{
public static void main(String args[])
{
boolean connected=true;
try
{
ServerSocket ss = new ServerSocket(2007);
int clientnum = 0;
while(connected) {
ServerThread st = new ServerThread(ss.accept(),clientnum);
st.start();
clientnum++;
System.out.println(clientnum); }
}
catch(Exception e)
{
System.out.println("异常"+e);
}
}
}
class ServerThread extends Thread
{
private Socket s;
int clientnum;
public ServerThread(Socket s,int num)
{
this.s=s;
clientnum=num+1;
}
public void run()
{
try
{
InputStream is=s.getInputStream();
OutputStream os=s.getOutputStream();
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
String request=dis.readLine();
System.out.println(request);
PrintStream ps=new PrintStream(os);
ps.println("Bye");
s.close();
}
catch(Exception e)
{
System.out.println("异常"+e);
}
}
}

多次运行客户端程序,调用3次后可以看到服务器端结果:

1
hello
2
hello
3
hello

《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端的更多相关文章

  1. 《安卓网络编程》之第二篇 java环境下网络通信的综合应用

    经过前面内容的学习,我们了解了Java技术中实现网络通信的基本知识.下面将通过一个具体视力的实现过程,讲解客户端和服务器端通信的流程. 服务器端的实现文件是 Server.java,代码如下: imp ...

  2. Pyhont 网络编程【第一篇】初始Socket网络套接字

    一.什么是socket: Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不 ...

  3. 《安卓网络编程》之第四篇 处理URL地址

    在Android手机系统中,可以通过URL地址获取网络资源.在URL类的众多方法中,可以使用openStream()方法来读取该URL资源的输入流InputStream.在此方法的基础上可以引申出很多 ...

  4. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

  5. ElasticSearch入门 第一篇:Windows下安装ElasticSearch

    这是ElasticSearch 2.4 版本系列的第一篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. NLPIR分词工具的使用(java环境下)

    一.NLPIR是什么? NLPIR(汉语分词系统)由中科大张华平博士团队开发,主要功能包括:中文分词,词性标注,命名实体识别,用户词典功能,详情见官网:http://ictclas.nlpir.org ...

  7. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...

  8. Java环境下shiro的测试-认证与授权

    Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...

  9. 这是关于FastJson的一个使用Demo,在Java环境下验证的

    public class User { private int id; private String name; public int getId() { return id; } public vo ...

随机推荐

  1. 性能测试培训:定位jvm耗时函数

    性能测试培训:定位jvm耗时函数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...

  2. 性能调优案例分享:jvm crash的原因 2

    3.core dump分析 有了core dump文件,接下来要做的就是通过命令去解析此文件,定位具体问题了,主要有以下三个命令: (1)先执行gdb $JAVA_HOME$/bin/java cor ...

  3. Nodejs express 获取url参数,post参数的三种方式

    express获取参数有三种方法:官网实例: Checks route params (req.params), ex: /user/:id Checks query string params (r ...

  4. VC++6.0中不兼容问题

    记得上次用VC++6.0已经是很长一段时间之前的事情了.这次由于需要学习计算机图形学,要开始学这写一些算法之类的,我又开始了VC++之旅. 重新安装一个vc++,我用的是Visual C++ 6.0( ...

  5. python 实例方法,类方法和静态方法

    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法, ...

  6. 生成订单:三个表(Products,Orders,OrderItem)

    1.有三个表(Product上,Orders,OrderItem) 分别创建对应的三个实体类 OrderItem中有外键Order_id 参考Orders中的id :Product_id参考Produ ...

  7. 7种创建线程方式,你知道几种?线程系列Thread(一)

    前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对 ...

  8. 简单的后台数据和前台数据交互.net

    最近忙着做POS项目,心血来来潮写了点小项目. 更具要求是随机显示数据并且产生的数据是可以控制的.前台交互显示能够倒叙,切每次只显示一条,页面不能超过20条超过的部分做删除. 我先展示一下前台的代码, ...

  9. HashMap 构造函数

    HashMap总共提供了三个构造函数 /** * Constructs an empty <tt>HashMap</tt> with the default initial c ...

  10. C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

    下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点)    int x;    int y;    int len;   //node中有3个成员变量x,y,l ...