------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程:
网络通讯要素:
1、IP地址
2、端口号
3、传输协议
IP地址:
(1)、它是网络中的设备标识 //每台主机都有自己的IP地址,这样才能将数据发送到指定的地方
(2)、不易记忆,可用主机名表示,两者存在映射关系 //如:www.baidu.com
(3)、本机回环地址:127.0.0.1,主机名为:localhost。
Java将IP地址封装成了一个对象,存在于java.net包中:InetAddress类
InetAddress类常用方法:
1、getLocalHost()此方法是静态的,可以获取InetAddress对象
2、static InetAddress getByName(String host):获取指定主机的IP和主机名
3、getHostAddress:获取本地地址
示例:
<span style="font-size:18px;">import java.net.InetAddress;
public class IPDemo {
public static void main(String[] args) throws Exception {
//static InetAddress getLocalHost() 返回本地主机地址和名称。
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());
//获取本地IP地址(最为常用)
String IPAddress = i.getHostAddress();
//获取本地主机名称
String HostName = i.getHostName();
//获取任意一台主机IP地址
//static InetAddress getByName(String host)
InetAddress ia = InetAddress.getByName("www.baidu.com");
System.out.println(ia.toString());
}
}
</span>
端口号:
1、数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序(例如QQ)都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)。
2、用于标识进程的逻辑地址,不同进程的标识不同
3、有效端口:0~65535,其中0~1024端口为系统使用或保留端口。
注意:进行通信连接时,一定要指定端口才能发送到对方指定的应用程序上。
网络模型:OSI参考模型和TCP/IP参考模型
OSI参考模型分为:应用层,表示层,会话层,传输层, 通信层,网络层,数据链路层,物理层;
TCP/IP参考模型简化了OSI参考模型。只分为:应用层,传输层,网际层,主机至网络层,一般来说开发处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP。
通常用户操作的是应用层,而编程人员需要做的是传输层和网际层,用户在应用层操作的数据,经过逐层封包,最后到物理层发送到另一个模型中,再进行逐层解包。
传输协议:
通信规则,最常用的协议为:TCP和UDP协议
Socket
1,什么是Socket
网络服务提供的一种机制,通信两端都要有Socket,才能进行数据的传输,数据在两个Socket间通过IO传输。
2,Socket通讯的过程
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
UDP:
1、面向无连接,不需要建立连接
2、将数据及源和目的封装成数据包,每个数据包的大小限制在64K内
3、不可靠,因为无连接,是不可靠协议
4、速度快,因为不用建立连接
UDP应用:
通常应用应用与聊天,视频会议,桌面共享等即使丢失数据也不妨碍进行的通信。
UDP示例:
<span style="font-size:18px;">/*
udp发送端:
*/
import java.net.*;
class UdpSend
{
public static void main(String[] args)throws Exception
{
//1、通过DatagramSocket对象创建UDP服务。
DatagramSocket datagramSocket=new DatagramSocket();
//2、确定数据,并封装成数据包。
byte[] buf="Hello World".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.152.1"),8888);
//3、通过Socket服务,将已有的数据包发送出去。通过send方法。
datagramSocket.send(dp);
//4、关闭资源
datagramSocket.close();
}
}
/*
udp接收端
*/
class UdpReceive
{
public static void main(String[] args)throws Exception
{
//1、创建udp Socket服务,建立端点
DatagramSocket ds=new DatagramSocket(8888);
//2、定义数据包。用于存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3、通过Socket服务的receive方法将接收到的数据存入数据包中
ds.receive(dp); //阻塞式方法,当没有数据可以接收时,程序会停止运行,等待数据。
//4、通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostName();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5、关闭资源
ds.close();
}
}
}
</span>
TCP:
1、面向连接,建立连接,形成传输数据的通道。
2、在连接中进行大数据量的传输
3、通过三次握手完成协议,是可靠协议 //第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。
4、必须建立连接,效率稍低
<span style="font-size:18px;">import java.io.*;
import java.net.*;
/*客户端*/
public class ClientText {
/*
服务端读取客户端键盘录入的信息,并将其转成大写。
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Socket s = new Socket("192.168.152.1",10005);
//读取键盘录入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//将数据输出到服务端
BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//接收服务端发送过来的数据
BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufout.write(line);
bufout.newLine();
bufout.flush();
String str = bufrin.readLine();
System.out.println("服务端说:"+str);
}
s.close();
bufr.close();
}
}
/*服务端*/
class ServerText
{
public static void main(String[] args) throws Exception
{
//端口号必须和客户端指定的端口号一致
ServerSocket ss = new ServerSocket(10005);
//通过accept方法接收一个通信对象
Socket s = ss.accept();
//接收客户端的数据
BufferedReader bufrin = new BufferedReader(new InputStreamReader(s.getInputStream()));
//发送数据到客户端
BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line=bufrin.readLine())!=null)
{
bufout.write(line.toUpperCase());
bufout.newLine();
bufout.flush();
}
s.close();
ss.close();
}
}
</span>
TCP上传图片:
<span style="font-size:18px;">/*
客户端
*/
package cn.itcast.net.p1.uploadpic;
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 UploadPicClient {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//1,创建客户端socket。
Socket s = new Socket("192.168.1.100",10006);
//2,读取客户端要上传的图片文件。
FileInputStream fis = new FileInputStream("c:\\0.bmp");
//3,获取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(buf);
String text = new String(buf,0,lenIn);
System.out.println(text);
fis.close();
s.close();
}
}
</span>
<span style="font-size:18px;">/*
服务端
*/
package cn.itcast.net.p1.uploadpic;
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 UploadPicServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//创建tcp的socket服务端。
ServerSocket ss = new ServerSocket(10006);
while(true){
Socket s = ss.accept();
new Thread(new UploadTask(s)).start();
}
//获取客户端。
// ss.close();
}
}
</span>
<span style="font-size:18px;">/*
定义线程
*/
package cn.itcast.net.p1.uploadpic;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadTask implements Runnable {
private static final int SIZE = 1024*1024*2;
private Socket s;
public UploadTask(Socket s) {
this.s = s;
}
@Override
public void run() {
int count = 0;
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ".....connected");
try{
// 读取客户端发来的数据。
InputStream in = s.getInputStream();
// 将读取到数据存储到一个文件中。
File dir = new File("c:\\pic");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, ip + ".jpg");
//如果文件已经存在于服务端
while(file.exists()){
file = new File(dir,ip+"("+(++count)+").jpg");
}
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
if(file.length()>SIZE){
System.out.println(ip+"文件体积过大");
fos.close();
s.close();
System.out.println(ip+"...."+file.delete());
return ;
}
}
// 获取socket输出流,将上传成功字样发给客户端。
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}catch(IOException e){
}
}
}
</span>