1、网络通讯三要素:
a) IP
b) 端口
c) 协议:TCP 和UDP
2、IP
a) InetAddress
b) 网络设备的标识,因不易记忆用主机名
c) 本地回环地址:127.0.0.1 主机名:Localhost
d) 代码示例:
package net;
import java.net.InetAddress;
public class IPDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
InetAddress i=InetAddress.getLocalHost();
//sop(i.toString());
sop("address:"+i.getHostAddress());//获取主机地址
sop(""+i.getHostName());//获取主机名
InetAddress ia=InetAddress.getByName("www.baidu.com");
sop("address:"+ia.getHostAddress());//获取百度地址
sop("name:"+ia.getHostName());//获取百度地址
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
3、端口
a) 用于标识进程的逻辑地址,不同进程的标识。
b) 有效端口0-65535,其中0-1024是系统使用或保留端口
4、TCP
a) 建立连接,形成传输数据的通道
b) 在连接中进行大数据量传输
c) 通过三次握手完成连接,是可靠协议
d) 必须建立连接,效率会降低
5、UDP
a) 将数据及源和目的封装成数据包,不需要建立连接
b) 每个数据报的大小在限制在64K内
c) 因无连接,是不可靠协议
d) 不需要建立连接,速度快。
6、Socket
Socket就是为网络提供的一种机制,通信的两端都是socket,网络通信其实就是socket通信,数据在两个socket之间通过IO传输。
7、UDP传输
a) 发送端思路:
i. 建立UDPSocket服务
ii. 提供数据,并将数据封装到数据包中
iii. 通过socket服务的发送功能,将数据包发送出去
iv. 关闭资源
b) 接收端思路
i. 定义UDPSocket服务,监听一个端口,定义数字标识
ii. 定义一个数据包,接收字节数据,因为数据包对象中有很多功能可以提取字节数据中的不同数据信息
iii. 通过socket服务的receive 方法将收到的数据存入已定义好的数据包中
iv. 通过数据包对象的特有功能,将这些不同的数据取出打印在控制台上。
v. 关闭资源
c) 发送端代码实现
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSend {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
//1、创建UDP服务,通过DatagramSocket对象
DatagramSocket ds=new DatagramSocket();
//2、确定数据包并封装成数据包DatagramPacket(byte[] buf,int length,InetAddress address,int port)
byte[] buf="哈哈哈哈,你好啊!".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.11.211"),1000);
//3、通过socket服务,发送数据,用send方法
ds.send(dp);
//4、关闭资源
ds.close();
}
}
d) 接收端代码实现
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceive {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
//1、创建UDP socket,建立端点
DatagramSocket ds=new DatagramSocket(1000);
//2、定义数据包,用于存储数据
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3、通过服务的reveive方法将收到数据存入数据包中
ds.receive(dp);
//4、通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5、关闭资源
ds.close();
}
}
8、TCP传输
a) 客户端思路
建立对象时,就可以去连接指定的主机,因为TCP是面向连接的,所以在建立socket服务时就要有服务端存在,并连接成功,形成通过后,在该通道中数据传输
b) 服务端思路
i. 建立服务端的socket服务:ServerSocket()
ii. 获取链接过来的客户端对象,通过ServerSocket的accept方法,没有连接就会等,该方法称为阻塞式
iii. 客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流读取发过来的数据
iv. 关闭服务
c) 客户端代码实现
package net;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s=new Socket("192.168.11.211",1005);
//为了发送数据,应该获取socket流中的输出流
OutputStream out=s.getOutputStream();
out.write("TCP is comming".getBytes());
s.close();
}
}
d) 服务端代码实现
package net;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
//建立服务端socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(1005);
//通过accept方法获取连接过来的客户对象
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"connected");
//获取客户端发过来的数据,要使用客户端的读取流来获取数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
9、实例一:聊天程序
代码示例:
package net;
import java.net.DatagramSocket;
public class ChatDemo {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
DatagramSocket sendSocket=new DatagramSocket(1003);
DatagramSocket receSocket=new DatagramSocket(1002);
new Thread(new Send(sendSocket)).start();
new Thread(new Receive(receSocket)).start();
}
}
package net;
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{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))break;
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.11.211"),1002);
ds.send(dp);
}
}
catch(Exception e)
{
throw new RuntimeException("发送失败");
}
}
}
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive implements Runnable {
private DatagramSocket ds;
public Receive(DatagramSocket ds)
{
this.ds=ds;
}
public void run() {
while(true)
{
try{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
}
catch(Exception e)
{
throw new RuntimeException("接收失败");
}
}
}
}
10、实例二:编写文本转换服务器
a) 需求:客户端给服务器发送文本,服务器会将文本转成大写返回给客户端,而且客户端不断地进行文本转换,当客户端输入over结束
b) 步骤
i. 建立服务
ii. 获取键盘录入
iii. 将数据发给服务端
iv. 服务端返回大写数据
v. 关闭资源
c) 代码示例:
package net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class TransClient {
public static void main(String [] args)throws IOException
{
Socket s=new Socket("192.168.11.211",1007);
//定义读取键盘数据的流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//定义目的,将数据写入到Socket输出流,发给服务器
BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个Socket读取流,读取服务端返回的大写信息
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufout.newLine();
bufout.flush();
String str=bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}
package net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TransServer {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(1007);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println("ip"+ip);
//读取Socket读取流中的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//目的,Socket输出流,将大写数据写入到Socket输出流,并发给客户端
BufferedWriter bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line=null;
while((line=bufIn.readLine())!=null)
{
bufout.write(line.toUpperCase());
bufout.newLine();
bufout.flush();
}
s.close();
ss.close();
}
}
11、实例三:TCP复制文件
代码示例:
package net;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TextClient {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
Socket s=new Socket("192.168.11.211",1009);
BufferedReader bufr=new BufferedReader(new FileReader("file\\Stream.txt"));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
s.shutdownOutput();
BufferedReader bufIn =new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=bufIn.readLine();
System.out.println(str);
bufr.close();
s.close();
}
}
package net;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TextServer {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(1009);
Socket s=ss.accept();
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out=new PrintWriter(new FileWriter("music\\server.txt"),true);
String line=null;
while((line=bufIn.readLine())!=null)
{
out.println(line);
}
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功");
s.close();
ss.close();
}
}
12、实例四:上传图片
代码示例:
package net;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class PicClient {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
if(args.length!=1)
{
sop("请选择一个jpg格式图片");
return ;
}
File file=new File("file\\question.gif");
if(!(file.exists()&&file.isFile()))
{
sop("该文件不存在或者不是文件");
return ;
}
if(!file.getName().endsWith(".gif"))
{
sop("格式错误");
return ;
}
if(file.length()>1024*1024*5)
{
sop("文件过大");
return ;
}
Socket s=new Socket("192.168.11.211",10003);
FileInputStream fis=new FileInputStream("file\\question.gif");
//PrintWriter out=new PrintWriter(new FileWriter("file\\question.gif"));
OutputStream out=(OutputStream) 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 num=in.read(bufIn);
System.out.println(new String(bufIn,0,num));
fis.close();
s.close();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
package net;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class PicServer {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10001);
Socket s=ss.accept();
InputStream in=s.getInputStream();
FileOutputStream fos=new FileOutputStream("picture\\server.jpg");
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStream out=(OutputStream) s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
ss.close();
s.close();
}
}
13、实例五:用户校验
代码示例:
package net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class LoginClient {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
Socket s=new Socket("192.168.11.211",10101);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
for(int x=0;x<3;x++)
{
String line=bufr.readLine();
if(line==null)
break;
out.println(line);
String info=bufIn.readLine();
System.out.println("infor:"+info);
if(info.contains("欢迎")) break;
}
bufr.close();
s.close();
}
}
package net;
import java.net.ServerSocket;
import java.net.Socket;
public class LoginServer {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10101);
while(true)
{
Socket s=ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
package net;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class UserThread implements Runnable
{
private Socket s;
public UserThread(Socket s) {
this.s=s;
}
public void run()
{
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"connected");
try{
for(int x=0;x<3;x++)
{
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String name=bufIn.readLine();
BufferedReader bufr=new BufferedReader(new FileReader("file\\user.txt"));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
boolean flag=false;
while((line=bufr.readLine())!=null)
{
if(line.equals(name))
{
flag=true;
break;
}
}
if(flag)
{
System.out.println(name+",已登陆");
out.println(name+",欢迎光临");
break;
}
else{
System.out.println(name+",尝试登陆");
out.println(name+"用户名不存在");
}
s.close();
}
}
catch(Exception e)
{
throw new RuntimeException(ip+"接受失败!");
}
}
}
14、URL
package net;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
/**
* @param args
*/
public static void main(String[] args) throws MalformedURLException
{
//URL url=new URL("http://baidu.com?name=haha&age=33");
URL url=new URL("http://www.baidu.com");
sop("协议:"+url.getProtocol());//打印协议名词
sop("主机名:"+url.getHost());//打印主机名
sop("端口:"+url.getPort());//打印端口名
sop("路径:"+url.getPath());//打印路径
sop("文件名:"+url.getFile());//打印文件名
sop("查询部分"+url.getQuery());//查询部分
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
package net;
import java.net.*;
public class URLConnection {
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
URL url=new URL("http://www.baidu.com");
java.net.URLConnection conn=url.openConnection();
sop(conn);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}