标签:
1 网络模型概述
OSI参考模型
应用层
会话层
表示层
传输层
网络层
数据链路层
物理层
TCP/IP参考模型
应用层
传输层
网际层
主机至网络层
2IP地址
标识计算机的地址
本地回环地址:127.0.0.1 默认主机名:localhost
package Net;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ipdemo {
public static void main(String[] args) throws UnknownHostException {
//获取本地ip地址对象
InetAddress ip=InetAddress.getLocalHost();
//获取其它主机的ip地址 对象
ip=InetAddress.getByName("DESKTOP-27Q5TDU"); //也可以使用InetAddress.getByName("ip地址")
System.out.println(ip.getHostName());
System.out.println(ip.getHostAddress());
}
}
3 端口号
用于表示进程的逻辑地址 取0--65535 其中0-1024为系统使用或保留端口
4 协议
TCP/UDP协议
5 域名解析
一般通过域名(主机名)获取IP地址,先到本地缓存中寻找域名对应的IP地址,若寻找不到,再借助DNS服务器实现域名的解析
6SOCKET
SOCKET就是为网络服务提供的一种机制。
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
代码演示
UDP
package Net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UdpSendDemo {
public static void main(String[] args) throws SocketException, IOException {
//创建UDP的发送端
System.out.println("发送端启动");
/*思路:
* 1建立udp的socket服务
* 2将要发送的数据封装到数据包中
* 3 通过udp的socket服务将数据包发送出去
* 4关闭socket服务
*/
//1 udpsocket服务 通过DatagramSocket对象
DatagramSocket ds=new DatagramSocket();
// 2将要发送的数据封装到数据包中
String str="hello socket!";
byte []buf=str.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//3 通过udp的socket服务将数据包发送出去
ds.send(dp);
//4关闭socket服务
ds.close();
}
}
package Net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPReceiveDemo {
public static void main(String[] args) throws Exception {
/*
* 思路:
* 1建立udp的socket服务
* 2 创建数据包,用于存储数据
* 3 使用socket服务的receive方法将接收到数据包中
* 4 使用数据包的方法解析数据包数据
* 5 关闭资源
*/
System.out.println("接收端启动");
// 1建立udp的socket服务
DatagramSocket ds=new DatagramSocket(10000); //必须要明确端口
// 2 创建数据包,用于存储数据
byte []buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3使用socket服务的receive方法将接收到数据包中
ds.receive(dp);
//4使用数据包的方法解析数据包数据
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+text);
//5 关闭资源
ds.close();
}
}
dos版聊天程序的发送端与接收端
package Net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UdpSendDemo2 {
public static void main(String[] args) throws SocketException, IOException {
//创建UDP的发送端
System.out.println("发送端启动");
/*思路:
* 1建立udp的socket服务
* 2将要发送的数据封装到数据包中
* 3 通过udp的socket服务将数据包发送出去
* 4关闭socket服务
*/
//1 udpsocket服务 通过DatagramSocket对象
DatagramSocket ds=new DatagramSocket(5555);
// 2将要发送的数据封装到数据包中
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
byte []buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//3 通过udp的socket服务将数据包发送出去
ds.send(dp);
}
//4关闭socket服务
ds.close();
}
}
package Net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpReceiveDemo2 {
public static void main(String[] args) throws Exception {
/*
* 思路:
* 1建立udp的socket服务
* 2 创建数据包,用于存储数据
* 3 使用socket服务的receive方法将接收到数据包中
* 4 使用数据包的方法解析数据包数据
* 5 关闭资源
*/
System.out.println("接收端启动");
// 1建立udp的socket服务
DatagramSocket ds=new DatagramSocket(10000); //必须要明确端口
while (true)
{
// 2 创建数据包,用于存储数据
byte []buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3使用socket服务的receive方法将接收到数据包中
ds.receive(dp);
//4使用数据包的方法解析数据包数据
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+text);
}
//5 关闭资源
//ds.close();
}
}
一个聊天程序
package ChatDemo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run() {
try
{
System.out.println("接收端启动");
while (true)
{
byte []buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+text);
if(text.equals("886"))
{
System.out.println(ip+"......退出聊天室");
}
}
//5 关闭资源
//ds.close();
}
catch(Exception e)
{
}
}
}
package ChatDemo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Send implements Runnable {
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds=ds;
}
public void run() {
try{
System.out.println("发送端启动");
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
byte []buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
//3 通过udp的socket服务将数据包发送出去
ds.send(dp);
if("886".equals(line))
break;
}
//4关闭socket服务
ds.close();
}
catch(Exception e)
{
}
}
}
package ChatDemo;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ChatDemo {
public static void main(String[] args) throws SocketException {
DatagramSocket send=new DatagramSocket();
DatagramSocket rece=new DatagramSocket(10001);
new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start();
}
}
TCP代码演示
package TcpDemo;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws Exception {
/*
* 建立TCP服务端的思路
*
* 1 创建服务端的socket服务,通过Socket对象.
* 2 服务端必须对外提供一个端口,否则客户端无法连接
* 3 获取连接过来的客户端对象
* 4 通过客户端对象获取Socket流读取客户端发来的数据 并打印在控制台上
* 5 关闭资源 关客户端,关服务端
*
*/
//1创建服务端对象
ServerSocket ss=new ServerSocket(5555);
//2获取连接过来的客户端对象
Socket s=ss.accept(); //阻塞式
String ip=s.getInetAddress().getHostAddress();
//3 通过socket对象获取输入流,读取客户端发来的数据
InputStream in=s.getInputStream();
byte []buf=new byte[1024];
int len=in.read(buf);
String text=new String(buf,0,len);
System.out.println(ip+":"+text);
s.close();
ss.close();
}
}
package TcpDemo;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
/* TCP传输:客户端建立的过程
*
* 1创建TCP客户端SOCKET服务,使用Socket对象
* 创建该对象一创建就明确目的地,要连接的主机
*
* 2如果连接建立成功,说明数据传输通道已建立。
* 传输通道是一个流 叫做Socket流 是底层建立好的 既然是流 说明这里既有输入又有输出
* 想要输入或者输出流对象 可以找Socket获取
* 可以通过getOutputStream()和getInputStream()来获取两个字节流
*
* 3 使用输出流
* 4 关闭资源
*/
//创建客户端Socket服务
Socket socket=new Socket("127.0.0.1",5555);
//获取Socket流中的输出流
OutputStream out= socket.getOutputStream();
//使用输出流将指定数据写出
out.write("tcpdemo...".getBytes());
//关闭资源
socket.close();
}
}
12 TCP客户端与服务端交互
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class tcp1 {
public static void main(String[] args) throws Exception, IOException {
/* TCP传输:客户端建立的过程
*
* 1创建TCP客户端SOCKET服务,使用Socket对象
* 创建该对象一创建就明确目的地,要连接的主机
*
* 2如果连接建立成功,说明数据传输通道已建立。
* 传输通道是一个流 叫做Socket流 是底层建立好的 既然是流 说明这里既有输入又有输出
* 想要输入或者输出流对象 可以找Socket获取
* 可以通过getOutputStream()和getInputStream()来获取两个字节流
*
* 3 使用输出流
* 4 关闭资源
*/
System.out.println("发送端启动");
Socket socket=new Socket("127.0.0.1",5555);
OutputStream out=socket.getOutputStream();
out.write("hello tcp".getBytes());
//读取服务端 返回的数据 要使用socket读取流
InputStream in=socket.getInputStream();
byte []buf=new byte[1024];
int len=in.read(buf);
String text=new String(buf,0,len);
System.out.println(text);
out.close();
}
}
服务端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class tcp2 {
public static void main(String[] args) throws Exception {
System.out.println("服务端启动");
//创建服务端套接字对象
ServerSocket ss=new ServerSocket(5555);
//接收客服端套接字
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
InputStream in=s.getInputStream();
byte []buf=new byte[1024];
int len=in.read(buf);
String text=new String(buf,0,len);
System.out.println(ip+":"+text);
//使用客户端socket对象的输出流给客户端返回数据
OutputStream out=s.getOutputStream();
out.write("收到".getBytes());
s.close();
ss.close();
}
}
13 应用 客户端发一串字母给服务端,服务端接收后将字母转换后给服务端
客户端
package Net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TransClient {
public static void main(String[] args) throws Exception, IOException {
/*
*
* 转换客户端
* 1 需要先有socket端点
* 2 客户端的数据源 键盘
* 3 客户端的 目的 socket
* 4 接收服务端的数据 源 socket
* 5 将数据显示在控制台上 目的 控制台
* 6 在这些流中操作的数据都是文本数据 (字符流读取即可)
*/
// 1 创建socket客户端对象
Socket socket=new Socket("127.0.0.1",5555);
//2 获取键盘录入
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//3,socket输出流
//new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
// 4 Socket流 读取服务器返回的大写数据
BufferedReader burIn= new BufferedReader(new InputStreamReader((socket.getInputStream())));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line);
//读取服务端发回的一行大写字母
String upperStr=burIn.readLine();
System.out.println(upperStr);
}
socket.close();
}
}
服务端
package Net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TransServer {
public static void main(String[] args) throws Exception {
/*
* 转换服务端
*
* 分析
* 1 Serversocket服务
* 2 获取socket对象
* 3 源 socket 读取客户端发过来需要转换的数据
* 4 目的 显示在控制台上
* 5 将数据转成大写给客户端 目的 socket
*
*/
//1
ServerSocket ss=new ServerSocket(5555);
//2 获取socket对象
Socket s=ss.accept();
//获取ip
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connect");
//3 获取socket读取流 并装饰
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//4 获取socket输出流 并装饰
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufIn.readLine())!=null)
{
System.out.print(line);
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
14 常见问题
服务端或者客户端出现无响应情况
是因为阻塞式的方法造成的 由于未添加结束标记等情况
15 上传文本文件应用
客户端
package UpLoad;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadClient {
public static void main(String[] args) throws Exception, IOException
{
//1
Socket s=new Socket("127.0.0.1",6666);
//2
BufferedReader bufr=new BufferedReader(new FileReader("E:\\x.txt"));
//3
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
s.shutdownOutput();
//4
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=bufIn.readLine();
System.out.println(str);
bufr.close();
s.close();
}
}
package UpLoad;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) throws Exception {
//1
ServerSocket ss=new ServerSocket(6666);
//2
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connect");
//3
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//4
BufferedWriter bufw=new BufferedWriter(new FileWriter("e:\\server.txt"));
String line=null;
while((line=bufIn.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("上传成功");
bufw.close();
s.close();
ss.close();
}
}
16 上传图片应用
客户端
package myNew1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadClient {
public static void main(String[] args) throws Exception, IOException {
//创建客户端socket
Socket s=new Socket("127.0.0.1",7777);
//读取客户端要上传的图片文件
FileInputStream fis=new FileInputStream("e:\\pingmu_u4.png");
//获取socket输出流 将读到的数据发送给服务器
OutputStream out=s.getOutputStream();
byte []buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
//告诉服务端 这边的数据发送完毕,让服务端停止读取
s.shutdownOutput();
//获取服务端发回的内容
InputStream in=s.getInputStream();
byte []bufIn=new byte[1024];
int lenIn=in.read(bufIn);
String text=new String(bufIn,0,lenIn);
System.out.println(text);
fis.close();
s.close();
}
}
服务端
package myNew1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) throws Exception {
//创建服务端套接字
ServerSocket ss=new ServerSocket(7777);
//获取客户端套接字
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
//读取客户端发来的数据
InputStream in=s.getInputStream();
//将数据读取到文件中
File dir=new File("e:\\picture");
if(!dir.exists())
{
dir.mkdirs();
}
File file=new File(dir,ip+".png");
FileOutputStream fos=new FileOutputStream(file);
byte []buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
fos.write(buf);
}
//获取socket 输出流 将上传成功字样发给客户端
OutputStream out=s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
ss.close();
}
}
16 服务端多线程技术
客户端
package myNew1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws Exception, IOException {
//创建客户端socket
Socket s=new Socket("127.0.0.1",7777);
//读取客户端要上传的图片文件
FileInputStream fis=new FileInputStream("e:\\pingmu_u4.png");
//获取socket输出流 将读到的数据发送给服务器
OutputStream out=s.getOutputStream();
byte []buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
//告诉服务端 这边的数据发送完毕,让服务端停止读取
s.shutdownOutput();
//获取服务端发回的内容
InputStream in=s.getInputStream();
byte []bufIn=new byte[1024];
int lenIn=in.read(bufIn);
String text=new String(bufIn,0,lenIn);
System.out.println(text);
fis.close();
s.close();
}
}
服务端
package myNew1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception
{
//创建服务端套接字
ServerSocket ss=new ServerSocket(7777);
while(true)
//获取客户端套接字
{
Socket s=ss.accept();
new Thread(new UploadTask(s)).start();
}
// ss.close();
}
}
线程任务
package myNew1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadTask implements Runnable {
private Socket s;
public UploadTask(Socket s)
{
this.s=s;
}
public void run() {
String ip=s.getInetAddress().getHostAddress();
//读取客户端发来的数据
try
{
InputStream in=s.getInputStream();
//将数据读取到文件中
File dir=new File("e:\\picture");
if(!dir.exists())
{
dir.mkdirs();
}
File file=new File(dir,ip+".png");
FileOutputStream fos=new FileOutputStream(file);
byte []buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
fos.write(buf);
}
//获取socket 输出流 将上传成功字样发给客户端
OutputStream out=s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}
catch(Exception e)
{
}
}
}
21 了解客户端和服务端原理
1 自定义服务端 用IE浏览器浏览
package myNew1;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class myTomcat {
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(3030);
Socket s=ss.accept();
InputStream in=s.getInputStream();
byte []buf=new byte[1024];
int len=in.read(buf);
//
String text=new String(buf,0,len);
System.out.println(text);
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("<font color=‘yellow‘ size=‘8‘>欢迎来到我的网站</font>");
s.close();
ss.close();
}
}
接着使用浏览器访问http://127.0.0.1:3030/
服务端收到
GET / HTTP/1.1 请求行
Host: 127.0.0.1:3030 请求头
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
18 URL使用
package myNew1;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class URLDEMO {
public static void main(String[] args) throws Exception {
String str_url="http://192.168.1.100:8080/myweb/1.html?name=lisi";
URL url=new URL(str_url);
System.out.println(":"+url.getProtocol());
System.out.println(":"+url.getHost());
System.out.println(":"+url.getPort());
System.out.println(":"+url.getFile());
System.out.println(":"+url.getFile());
System.out.println(":"+url.getQuery());
InputStream in=url.openStream();
//原理是获取了url对象的url连接器对象,将连接封装成了对象
//这个对象就是java内置的可以解析具体协议的对象+socket
//URLConnection conn=url.openConnection();
//conn.getInputStream();
//利用 URLConnection conn方法可以获取协议的具体字段
byte []buf=new byte[1024];
int len=in.read(buf);
String text=new String(buf,0,len);
System.out.println(text); //返回的数据已经对服务器返回的http应答行和应答头进行解析并省略
}
}
22 常见网络结构
C/S
B/S
标签:
原文地址:http://www.cnblogs.com/HJL085/p/5794142.html