网络编程:利用操作系统在不同通信协议上提供的接口(系统调用、函数库)实现网络进程的安全通信
网络进程:就是网点机(连入网络的计算机)上运行的程序。网络进程在通信协议中用端口(port)标识,而它驻留的网点机则用其IP地址或域名来标识
网络编程中有两个主要的问题:
网络编程模型:是客户机/服务器(C/S)结构
IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。
如:166.111.136.3,166.111.52.80
主机名(hostname):网络地址的助记名,按照域名进行分级管理
如:www.geminno.com
服务类型(service):网络的各种服务。
如:web服务, ftp服务, smtp服务, Telnet服务等
端口(Port):指TCP/IP协议中的端口,是逻辑意义上的概念。主机上每一个提供服务的程序都运行在该主机的一个对外开放的端口上。程序员可以在创建自己的服务程序时使用自定义的端口,通过这个端口号来连接服务进程以接收服务。
如果把IP地址比作一间房子 ,端口就是出入这间房子的门
网络:用通信线路和通信设备将分布在不同地点的多台自治计算机系统互相连接起来
OSI模型:OSI是Open System Interconnection的缩写,意为开放系统互联。国际标准化组织制定了OSI模型,把网络通信的工作分为七层
TCP/IP四层协议:OSI七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。
实际运用中,TCP/IP是一个四层体系结构,得到了非常广泛的运用
TCP/IP协议
协议:IP、TCP、UDP、HTTP、FTP、SMTP等
比如打电话
比如写信
Socket 是网络上的两个进程经过双向的通信而建立起来的一个实现数据传输的通道,这个双向链路的每一端都是一个Socket。
Socket由IP地址和端口号组成
IP地址:定位到网络中的一台PC
端口号:定位到PC中的一个进程
疑问:
开发者基于TCP协议的网络编程,
是否四层中所有细节都需涉及到呢?
答:
不需要
Java语言是目前最受欢迎的网络编程语言之一,
使用它能够轻松实现网络编程,只需涉及传输层。
Java网络编程涉及到的package: java.net
Java网络编程涉及到的package: java.io
Java网络编程涉及到的package: java.lang
InetAddress:描述Internet地址的类
java.net.URLConnection:
java.net.URLConnection:
服务端代码
publicstaticvoidmain(String[] args) {
ServerSocketserver = null;//声明服务端变量
DataInputStreamin = null;//声明输入流
Socketclient = null;//声明客户端变量
try {
server= newServerSocket(8888);//实例化服务端
client= server.accept();//接受客户端
System.out.println("与客户端建立连接");
//获得输入流(客户端==>服务端)
in = newDataInputStream(client.getInputStream());
Stringstr;
//循环输出来自客户端的信息
while((str= in.readUTF())!=null){
System.out.println("接受来自客户端的信息:"+str);
}
} catch(EOFException e) {
System.out.println("输入流已到末尾,程序退出");
} catch(IOException e) { e.printStackTrace();
}finally{
//释放输入流
try{in.close();}
catch(IOException e) {e.printStackTrace();}
//释放客户端
try{client.close();}
catch(IOException e) {e.printStackTrace();}
//释放服务端
try{server.close();}
catch(IOException e) {e.printStackTrace();}
}
}
--------------------------
客户端
publicstaticvoidmain(String[] args){
//客户端
Socketsocket = null;
//输出流(客户端==>服务端)
DataOutputStreamout = null;
try{
socket= newSocket("localhost", 8888);
out= newDataOutputStream(socket.getOutputStream());
//循环输出信息
for(inti = 0; i < 10; i++) {
out.writeUTF("Hello"+i);
try{
//每隔一秒钟输出一次
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}catch(IOException e) {
e.printStackTrace();
}finally{
//释放输出流
try{out.close();}
catch(IOException e) {e.printStackTrace();}
//释放客户端
try{socket.close();}
catch(IOException e) {e.printStackTrace();}
}
}
---------------------、
-------------------------
线程实现类:
publicclassMyServerThread implementsRunnable{
privateSocket socket;
publicMyServerThread(Socket socket) {
this.socket= socket;
}
@Override
publicvoidrun() {
Stringname = Thread.currentThread().getName();
System.out.println(name+"进入子线程执行...");
DataInputStreamin = null;
DataOutputStreamout = null;
try{
in= newDataInputStream(socket.getInputStream());
out= newDataOutputStream(socket.getOutputStream());
out.writeUTF("连接已建立!");
//循环处理Client端信息
while(true){
Stringstr = in.readUTF();
System.out.println(name+"接收到:"+str);
out.writeUTF("已接受字符,长度"+str.length());
}
}catch(IOException e) {
System.out.println("线程"+name+"异常关闭");
e.printStackTrace();
}finally{
try{in.close();} catch(IOException e) {e.printStackTrace();}
try{out.close();} catch(IOException e) {e.printStackTrace();}
}
}
}
-------------------------
客户端代码
publicstaticvoidmain(String[] args) throwsException{
System.out.println("启动Client...");
Socketsocket = null;
DataOutputStreamout = null;
DataInputStreamin = null;
Scannerscanner = newScanner(System.in);
try{
socket= newSocket("127.0.0.1", 8080);
out= newDataOutputStream(socket.getOutputStream());
in= newDataInputStream(socket.getInputStream());
System.out.println(in.readUTF());
while(true){
System.out.println("请输入向服务器发送的内容:");
Stringrequest = scanner.nextLine();
out.writeUTF(request);
Stringresponse = in.readUTF();
System.out.println(response);
}
}catch(Exception e) {
e.printStackTrace();
}finally{
in.close();
out.close();
scanner.close();
socket.close();
}
}