1、概述:
(1)通讯之前先找到对方的IP地址
(2)数据发送到对方指定的应用程序上,用“端口”为这些应用程序来标识
(3)定义通讯规则,称为“协议”
注意:默认的端口号是可以改的
2、网络编程模型:
(1)OSI参考模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
(2)TCP/IP模型
应用层
传输层
网际层
主机至网络层
3、通讯要素:
(1)IP地址:getHostAddress()返回主机的IP地址对象,getHostName()返回主机名
(2)端口号
(3)传输协议
4、UDP特点
(1)面向无连接
(2)数据会被封装成包,包体积有限
(3)不可靠(因为面向无连接)
(4)速度快
实际应用:聊天、视频会议、桌面共享
5、TCP特点:
(1)面向连接
(2)进行大量数据传输
(3)可靠(因为面向连接)
(4)效率低
实际应用:打电话
6、Socket编程
(1)Socket是为网络服务提供的一种机制
(2)通信俩端都有Socket
(3)网络通信其实就是Socket通信
(4)数据在俩个Socket间通过IO传输
7、UDP传输:
(1)创建UDP服务,通过DatagramSocket类
(2)确定传输数据,并将数据封装成包
(3)通过Socket服务的send()方法将已有的数据传输出去
(4)关闭资源
8、UDP接收协议:
接收端通常会指定一个端口号
(1)先创建Socket服务,通过DatagramSocket类创建
(2)通过DatagramPacket类创建数据包,用于接收发送端传输的数据包
(3)通过Socket的receive()方法来接收
(4)通过接收的数据包获取信息
(5)关闭服务
9、TCP传输:
(1)建立客户端和服务器端
(2)客户端对于的类是Socket,服务器端对于的类是ServerSocket
客户端步骤:
(1)创建Socket服务对象,指定目标主机和端口
(2)获取Socket流中的输出流
(3)关闭Socket
服务器端步骤:
(1)创建服务端的Socket服务,ServerSocket(),并监听一个端口
(2)获取连接过来的客户端对象,通过accept()方法
(3)客户端发送数据到服务器端,服务器端会获取对应的客户对象,并获取该对象的读取流来接收读取的数据,并打印
(4)关闭服务器端Socket
package org.com.internet;
import java.io.*;
import java.net.*;
//客户端
public class Tcp1 {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//创建客户端对象
Socket s=new Socket("192.168.1.102",10007);
//读取客户端已有的图片
File f=new File("c:\\1.jpg");
FileInputStream fs=new FileInputStream(f);
//将客户端的数据输出到服务器端
OutputStream out=s.getOutputStream();
byte[] b=new byte[1024];
int len=0;
while((len=fs.read(b))!=-1){
out.write(b, 0, len);
}
//数据读取完毕
s.shutdownOutput();
//读取数据
InputStream in=s.getInputStream();
byte[] b1=new byte[1024];
int len1=in.read(b1);
System.out.println(new String(b1,0,len1));
//关闭流
fs.close();
s.close();
}
}
//服务端
class TcpServer{
public static void main(String args[]) throws Exception{
//创建服务器端对象
ServerSocket ss=new ServerSocket(10007);
//服务器端接收客户端发送的数据
Socket s=ss.accept();
//获取输入流
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip);
InputStream in=s.getInputStream();
//创建上传对象路径
File f=new File("D.jpg");
FileOutputStream fos=new FileOutputStream(f);
//读取输入流
byte[] b2=new byte[1024];
int len=0;
while((len=in.read(b2))!=-1){
fos.write(b2, 0, len);
}
//输出数据到客户端去
OutputStream out=s.getOutputStream();
out.write("上传成功".getBytes());
//关闭流
fos.close();
ss.close();
}
}
出现问题:
先用eclipse运行 Tcp1时,出现如下异常
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at org.com.internet.Tcp1.main(Tcp1.java:13)
运行TcpServer,在运行tcp1时,出现如下异常:
192.168.1.102
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.com.internet.TcpServer.main(Tcp1.java:65
解决方法:
两个错误都是连接错误。tcp协议面向连结的传输机制,所以必须先有服务端才能连接成功,先运行客户端肯定失败。