Java Socket应用---通信是这样练成的

第1章 网络基础知识
一、网络基础知识
两台计算机要通过网络进行通信必备条件a、唯一的标识IP地址 b、需要共同的语言–协议 c、辨别不同的应用程序–端口号。
1.IP地址
每台计算机的唯一标识,用来区分网络中的不同主机,是两台主机进行网络通信必不可少的。IPV4
2、协议:
a、TCP/IP协议:目前世界上应用最为广泛的协议。是以TCP和IP为基础的不同层次上多个协议的集合。也称为:TCP/IP协议族或者TCP/IP协议栈
b、TCP Transmission Control Protocol传输控制协议
c、IP Internet Protocol 互联网协议
d、TCP/IP模型(网络分层)
1:物理层,网线……
2: 数据链路层
3:网络层
4:传输层
5:应用层:HTTP超文本传输协议、FTP文件传输协议、SMTP简单邮件传送协议、Telnet远程登录服务
3、端口号:
a、用于区分不同的应用程序
b、端口号范围为0-65535,其中0-1023为系统所保留;
c、IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和 UDP的基础
d、常用端口号:http:80;ftp:21;telnet:23
java中的网络支持
针对网络通信的不同层次,java提供的网络功能有四大类
1、InetAddress:用于标识网络上的硬件资源(IP地址)
2、URL:统一资源定位符–通过URL可以直接读取或写入网络上的数据
3、Sockets:使用TCP协议实现网络通信的Socket相关的类
4、Datagram:使用UDP协议。将数据保存在数据报中,通过网络进行通信
第2章 Java 中网络相关 API 的应用
2-1 Java 中的 InetAddress 的应用
InetAddress类没有构造方法,所以不能直接new出一个对象;
可以通过InetAddress类的静态方法获得InetAddress的对象;
InetAddress.getLocalHost();
InetAddress.getByName(“”);
类主要方法:
String - address.getHostName();
String - address.getHostAddress();
public static InetAddress getByName(String host) throws UnknownHostException
在给定主机名的情况下确定主机的 IP 地址。
主机名可以是机器名(如 “java.sun.com”),也可以是其 IP 地址的文本表示形式。
2-2 Java 中的 URL 的应用
1.URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址。
2.URL由两部分组成:协议名称和资源名称,中间用冒号隔开。
3.在java.net中提供了URL类来表示URL。
使用URL读取网页的内容
1.通过URL对象的openStream()方法可以得到指定资源的输入流。
2.通过输入流可以读取、访问网络上的数据。

//创建一个URL实例
URL imooc=new URL(“http://www.imooc.com“);
//?后面表示参数,#后面表示锚点
URL url=new URL(imooc, “/index.html?username=tom#test”);
//主要方法:
//getProtocol();getHost();getPort();getPath();getFile();getRef();getQuery();
//读取网页内容
//通过URL的openStream方法获取URL对象所表示的资源的字节输入流
InputStream is = url.openStream();
第3章 通过 Socket 实现 TCP 编程
3-1 Socket 简介
通信过程(Socket通信模型):
1、在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接。
2、当客户端创建连接Socket并且向服务端发送请求。
3、服务器收到请求,并且接受客户端的请求信息。一旦接收到客户端的连接请求后,会创建一个链接socket,用来与客户端的socket进行通信。
通过相应的输入/输出流进行数据的交换,数据的发送接收以及数据的响应等等。
4、当客户端和服务端通信完毕后,需要分别关闭socket,结束通信。
ServerSocket常用方法:
ServerSocket(int port)——创建并绑定到特定端口的服务器套接字
accept()——侦听并接受到此套接字的连接
close()——关闭此套接字
getInetAddress()——得到ServerSocket对象绑定的IP地址。如果ServerSocket对象未绑定IP地址,返回0.0.0.0。
getLocalPort()——返回此套接字在其上侦听的端口

Socket常用方法:
Socket(InetAddress address, int port)——创建一个套接字并将其连接到指定ip地址的指定端口号
Socket(String host, int port)——创建一个套接字并将其连接到指定主机上的指定端口号
close()——关闭此套接字
getInetAddress()——返回套接字连接的地址
getInputStream()——返回此套接字的输入流
getOutputStream——返回此套接字的输出流
3-2 编程实现基于 TCP 的 Socket 通信之服务器端
Socket服务端的创建
1.创建ServerSocket对象,绑定监听端口
2.通过accept()方法监听客户端去那个球
3.连接建立后,通过输入流读取客户端发送的请求信息
4.通过输出流向客户端发送响应信息
5.关闭相关资源
/1.创建一个serverSocket
ServerSocket serverSocket = new ServerSocket(8888);
//2.调accept()方法开始监听,等待客户端连接
System.out.println(“*服务器已经启动,等待连接”);
Socket socket = serverSocket.accept();
//3.获取输入流,用来赢取客户端发送的信息
InputStreamReader ir = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(ir);
String data = br.readLine();
while(data!=null){
System.out.println(“我是客户端给你发送数据:” + data);
data = br.readLine();
}
socket.shutdownInput(); //关闭输入流。
br.close();
ir.close();
Socket客户端的创建
1.创建Socket,指定要连接的服务器的地址和端口号
2.连接建立后,通过输出流向服务器端发送请求信息
3.通过输入流获取服务器响应的信息
4.关闭相应的资源
3-3 编程实现基于 TCP 的 Socke t通信之客户端
client.java
/*
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//1.创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket(“localhost”, 8888);
//2.获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
pw.write(“用户名:alice;密码:789”);
pw.flush();
socket.shutdownOutput();//关闭输出流
//3.获取输入流,并读取服务器端的响应信息
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println(“我是客户端,服务器说:”+info);
}
//4.关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3-4 完善用户登陆之服务器响应客户端
步骤:
(1)创建ServerSocket和Socket
(2)打开连接到Socket的输入/输出操作
(3)按照协议对Socket进行读/写操作
(4)关闭输入输出流,关闭Socket

服务器端:
(1)创建ServerSocket对象,绑定监听器
(2)通过accept()方法监听客户端请求
(3)连接建立以后通过读取客户端发送请求消息
(4)通过输出流向客户端发送响应信息
(5)关闭资源
客户端:
(1)创建Socket对象,指明需要连接的服务器地址和端口号(1023以后的端口)
(2)连接建立后,通过输出流向服务器端请求
(3)通过输入流获取服务器响应信息
(4)关闭资源
常用I/O操作
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is)//将字节输入流转换为字符输入流
BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
br.readLine()按行读取

flush()刷新缓存
3-5 使用多线程实现多客户端的通信
多线程服务器:
应用多线程来实现服务器与多客户端之间的通信
基本步骤:
1、服务器端创建ServerSocket,循环调用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端连接
3、服务器端接受客户端的请求,创建socket与客户端建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务器端继续等待新的连接
第4章 通过 Socket 实现 UDP 编程
4-1 DatagramPacket
UDP 编程:
特点:udp协议是无连接,无状态,无序的、不可靠的。
优点:速度快。
原理:将需要发送的信息封装在数据报(Datagram),在数据报里指明Socket主机和端口号。然后发送出去。
使用的操作类:
DatagramPacket 表示数据报包
DataSocket 用来发送和接收数据报包的套接字。

套接字 - 通信
要通过Internet进行通信,至少需要一对套接字,其中一个运行在客户端,称之为ClientSocket,另一个运行于服务器端面,称为ServerSocket。根据连接启动的方式以及本地要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。
服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求。
连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。而服务器端继续处于监听状态,继续接收其他客户端的连接请求。
使用套接字进行数据处理有两种基本模式:同步和异步。
同步模式:
同步模式的特点是在通过Socket进行连接、接收、发送数据时,客户机和服务器在接收到对方响应前会处于阻塞状态,即一直等到收到对方请求进才继续执行下面的语句。可见,同步模式只适用于数据处理不太多的场合。当程序执行的任务很多时,长时间的等待可能会让用户无法忍受。
异步模式:
异步模式的特点是在通过Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收、发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。可见,异步套接字特别适用于进行大量数据处理的场合。
使用同步套接字进行编程比较简单,而异步套接字编程则比较复杂。
4-2 编程实现基于 UDP的 Socket 通信之服务器端
基于UDP的Socket通信.(服务器端)
接收客户端的信息
1.先创建服务器端DatagramSocket,参数指定端口.
DategramSocket socket=new DatagramSocket(8800);
2.创建数据报,用于接收客户端发送的数据.
先创建字节数组存放数据.
byte []data=new byte[1024];
DategramPacket packet=new DatagramPacket(data,data.length);
3.接收客户端发送的数据
socket.receive(packet) //receive()方法用于接收数据存放在数据报中,参数为数据报DatagramPacket的实例.
String info=new String(data,0,packet.getLength()); //getLength()方法可以获取数据报的长度.

向客户端响应数据
1.定义客户端的地址、端口号、数据(通过客户端传来的数据的所存放的DatagramPacket的实例获取)
InetAddress address=packet.getAddress(); //从服务器端存放客户端的数据报中获取客户端的地址,通过getAddress()方法.
int port=packet.getPort(); //通过getPort()方法获取客户端的端口.
byte [] data2=”欢迎你”.getBytes(); //把字符串转为字节数组
2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2,data2.length,address,port)
3.响应客户端
socket.send(packet2); //把服务器端要进行响应的数据报发送给客户端,不需要创建新的DatagramSocket对象,一个即可.
4.关闭资源.
socket.close() //关闭此套接字.
4-3 编程实现基于 UDP 的 Socket 通信之客户端
一、服務端向客户端响应数据
/*
* 向客户端响应数据
*/
//1.定义客户端的地址、端口号、数据
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2=”欢迎您!”.getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();

二、
/*
* 接收服务器端响应的数据
*/
//1.创建数据报,用于接收服务器端响应的数据
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply=new String(data2, 0, packet2.getLength());
System.out.println(“我是客户端,服务器说:”+reply);
//4.关闭资源
socket.close();
第5章 Socket 总结
1、多线程的优先级(死循环中注意设置优先级问题。)建议降低优先级。
2、关闭socket流,而不提倡关闭输入输出流。
3、使用tcp通信传输对象更符合面向对象编程的思想。
4、通过socket编程传输文件的功能模块是:通过io流读取文件字符流进行传输。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值