------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
概述
网络编程(三要素):
1.找到对方的IP;
2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,即端口(逻辑端口);
3.定义通信规则。这个通讯规则称为协议,国际组织定义了通用的协议TCP/IP。
IP的基本知识:
IP地址范围:0-255;
特殊的IP地址:127.0.0.1(本地回环地址,可以在cmd中ping它来测试网卡);
端口范围:0-65535,其中0-1024端口系统保留自用了。
常见的默认的端口:
MySQL:3306
Web:80
Tocat:8080
IP地址的取得(InetAddress类在java.net包中)
例:
InetAddress i=InetAddress.getLocalHost();
System.out.println(i.toString());
InetAddress[] getAllByName("www.baidu.com");//取得百度主机的地址
网络传输的两种方式的区别(必背)
UDP:
①将数据及源和目的封装成数据包,不需要建立连接
②每个数据包的大小在64K内
③因为无连接,所以是不可靠协议
④因为不需要连接,所以速度快
TCP:
建立连接,形成传输数据的通道
在连接中进行大量数据的传输
通过三次握手完成连接,是可靠的协议
必须建立连接,效率会稍低
UDP
UDP接收端:
思路:
1.定义UDPsocket服务
2.定义一个数据包,因为要存储接收到的字节数据。数据包对象有更多功能可以提取字节数据中不同数据的信息
3.通过socket服务的receive()方法将接收到的数据存入已定义好的数据包中
4.通过数据包的特有功能,将这些不同的数据取出,打印到控制台上
5.关闭资源
DatagramSocket ds=new DatagramSocket(10000);//创建UDPsocket端点并指定其监听的端口
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);//定义数据包,用于存储数据
ds.receive(dp);//通过receive方法接收数据到dp里面
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System,out.print(ip+"::"+data+"::"+port);//通过数据包的各种获取
ds.close();//关闭资源
TCP
服务端:
1.建立服务端的Socket服务。ServerSocket
2.获取连接过来的客户端对象。通过ServerSocket的accept()方法,没有连接就等,所以这个方法是阻塞式方法
3.客户端如果发送过来数据,那么服务端要使用对应的客户端对象。并获取到该客户端对象的读取流读取发过来的数据
4.关闭服务端
ServerSocket ss=new ServerSocket(10000);//建立服务端Socket服务,并监听10000端口
Socket s=ss.accept();//通过accept()方法来获取连接过来的客户端对象,阻塞式方法
InputStream in=s.getInputStream();//获取客户端的读取流来获得客户端发过来的对象
byte[] buf=new byte[1024];
int len=in.read(buf);//通过客户端输入流读取数据
System.out.println("buf,0,len");
s.close();//关闭客户端
ss.close();//关闭服务端(实际应用一般不用关闭)
TCP传输的客服互访
思路:
客户端Socket s对象连接服务器;
服务端ServerSocket ss通过accept()方法接收客户端的s对象
通过两端的s.InputStream()和s.OutputStream()互访
练习:建立一个文本转换服务器,代码如下:
package com.ken;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
/**
* 客户端,发数据给服务器,并且接收服务器返回的数据
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("127.0.0.1",10004);
OutputStream out=s.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
InputStream in=s.getInputStream();
BufferedReader brin=new BufferedReader(new InputStreamReader(in));
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
line=brin.readLine();
System.out.println(line);
}
br.close();
bw.close();
brin.close();
s.close();
}
}
package com.ken;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
/**
* 建立一个文本转换服务器,将接收到的字母以大写或者小写写回客户端
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10004);
Socket s=ss.accept();
BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line=null;
while((line=br.readLine())!=null){
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
s.close();
br.close();
bw.close();
}
}
这两段代码要注意的地方:
①使用IO记得刷新
②readLine()方法需要换行符,而恰好newLine()方法提供换行符