----------- android培训、java培训、期待与您交流! ------------
实现计算机互联的三要素:
1、IP地址
本机回路IP:127.0.0.1
2、端口号(逻辑端口):用于标识应用程序。
端口号0~65535之间的整数;0~1024之间大部分已被用于一些知名的网络服务和应用,所以现在开发的网络应用程序端口号一般是1024以后的整数。
3、通信协议
TCP:三次握手机制,面向连接,稍慢。可靠
UDP:无连接,每个数据报大小限制在64K内。传输快。不可靠。
网络参考模型
TCP/IP参考模型
应用层:javaWeb开发
传输层:TCP/UDP
网际层:IP
主机至网络层:有线还是无线,光纤还是电话线等
描述IP的java包:java.net 下的InetAddress类。
mport java.net.InetAddress;
import java.util.Arrays;
public class IPDemo {
public static void main(String[] args) throws Exception {
/*InetAddress i = InetAddress.getLocalHost();
//本机主机地址、主机名
String ip = i.getHostAddress() + "..." + i.getHostName();
System.out.println(ip);*/
//获取任意一台主机信息
InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
for(InetAddress ia : ias) {
System.out.println(ia.getHostAddress() + "..." + ia.getHostName());
}
}
}
网络编程:其实就是Socket编程
通信的两端都有Socket, 数据在两个Socket间通过IO传输。
UDP传输:DatagramSocket和DatagramPacket
一个简单的UDP通信示例
class UDPsend {
public static void main(String[] args) throws Exception {
//创建UDP socket端点,可以指定固定端口发送数据,不指定则系统随机产生
DatagramSocket ds = new DatagramSocket();
//确定数据,并封装成数据包
byte[] buf = "Hello, java".getBytes();
DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);
//通过UDP socket的sent方法发送数据
ds.send(dp);
System.out.println("发送成功");
}
}
class UDPreceive {
public static void main(String[] args) throws Exception {
//创建UDP socket端点,指定用于接收数据的端口
DatagramSocket ds = new DatagramSocket(8888);
//定义数据包用于接收数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);
//接收数据存入于数据包中
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip + ", " + port + ", " + data);
ds.close();
}
}
需求:用TCP完成一个英文文本大小写转换的客户端和服务器端
客户端发送一个英文字符串到服务端,服务端返回一个将字符串转为全大写后的信息到客户端
import java.net.*;
import java.io.*;
/*
* 建立一个文本转换器
*
* 分析:操作的是客户端发来的文本信息数据,所以要用到IO流技术。
*
* 步骤:
* 1、建立服务
* 2、获取键盘录入
* 3、将数据发给服务端
* 4、服务端将小写字母全部转换为大写后发送给客户端
* 5、关闭资源
* */
public class TCPTextCast {
public static void main(String[] args) {
}
}
class TCPClient1 {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 10003);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//优化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);
//将bufOut传入PrintWriter(bufOut)也行
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line=br.readLine())!= null) {
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush();
//三句变一句,用out.println(line);
System.out.println("Server: " + bufIn.readLine());
}
br.close();
s.close();
}
}
class TCPServer1 {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10003);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "...connceted");
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String data = null;
while((data=br.readLine()) != null) {
System.out.println(ip + "... : " + data);
bw.write(data.toUpperCase());
bw.newLine();
bw.flush();
}
s.close();
ss.close();
}
}
TCP上传文件实例代码:
/*
* 使用TCP协议写一个可以上传文件的服务器和客户端。
*
* 思路:网络编程与IO流相拼命
* 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream.
* 还有通过socket的输入流读取服务器端的反馈信息。
* 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息
* 资源关闭
* */
import java.net.*;
import java.io.*;
public class FileLoader {
public static void main(String[] args) {
}
}
//客户端
class client {
public static void main(String[] args) throws Exception {
//建立Socket服务
Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);
//从客户端本地读取文件,并写入socket的输出流中
OutputStream out = fileLoaderSocket.getOutputStream();
InputStream fileRead = new FileInputStream("G:\\Demo.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len=fileRead.read(buf)) != -1) {
out.write(buf, 0, len);
}
//告诉服务端,文件已传输完毕
fileLoaderSocket.shutdownOutput();
//获取从服务端反馈的信息
BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));
String serverBack = in.readLine();
System.out.println(serverBack);
//资源关闭
fileLoaderSocket.close();
fileRead.close();
}
}
//服务端
class Server {
public static void main(String[] args) throws Exception {
//建立服务端Socket
ServerSocket ss = new ServerSocket(10005);
//接收客户端Socket
Socket fileLoaderSocket = ss.accept();
//打印连接信息
String ip = fileLoaderSocket.getInetAddress().getHostAddress();
System.out.println(ip + "...conncected");
//接收文件,并保存
InputStream in = fileLoaderSocket.getInputStream();
OutputStream fileSave = new FileOutputStream("E:\\server.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf)) != -1) {
fileSave.write(buf, 0, len);
fileSave.flush();
}
//返回文件复制情况信息
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));
out.write("文件上传成功");
out.flush();
//资源关闭
ss.close();
fileLoaderSocket.close();
fileSave.close();
}
}
public Socket() 到底连接哪台主机?
它是用
public void connect(SocketAddress endpoint,int timeout) throws IOException
SocketAddress是abstract类,它有个子类InetSocketAddress ,此类实现 IP 套接字地址(IP 地址 + 端口号)。
ServerSocket可以指定能连接客户端的最大数:
public ServerSocket(int port,int backlog) throws IOException
域名解析:
1、首先找本机 C:\WINDOWS\system32\drivers\etc 下的hosts文件配对
2、若上述文件中不存在映射(域名-IP),则进行下面的步骤:
----------------------- android培训、java培训、期待与您交流! ----------------------