网络编程(在网络上实现IO的传输)
涉及计算机网络的知识
\
一.网络编程有两个主要问题
1.如何准确定位网络上一台或多台主机,定位主机上的特定的应用 2.找到主机后如何高效地进行数据传输
二.网络通信要素概述
1.IP和端口号 2.提供网络通信协议:TCP/IP参考模型(应用层,传输层,网络层,物理+数据链路层)
三.通信要素1:IP
1.IP:
2.在java中用InetAddress类代表IP
3.IP分类:IPV4和IPV6;万维网和局域网
4.域名:www.baidu.com www.mi.com
5.本地回路地址:127.0.0.1 对应着localhost
6.如何实例化InetAddress:两个方法:getName(String host),getLocalHost
两个常用方法:getHostName()getHostAddress()
端口号:标识正在计算机上运行的进程(程序)
要求:不同的进程有不同的端口号
\
网络通信要素2:网络协议
TCP:打电话(需要双方都在)
UDP:发短信,打电报(不需要对方在)
三次握手,四次挥手(重点中的重点)
练习1:客户端发送信息给服务端,服务端将数据显示在控制台上
实现TCP的网络编程
例子1:客户端发送信息给服务端,服务端将数据显示在控制台上
*/
public class TCPTest1 {
//客户端
@Test
public void client() throws IOException {
//1.创建Socket对象,指明服务器端的ip和端口号
InetAddress inet = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(inet,8899);
//2.获取一个输出流,用于输出数据
OutputStream os = socket.getOutputStream();
//3.写出数据的操作
os.write("你好,我是客户端MM".getBytes());
//4.资源的关闭
socket.close();
os.close();
}
//服务端
@Test
public void server() throws IOException {
//1.创建服务器端的ServerSocket,指明自己的端口号
ServerSocket ss = new ServerSocket(8899);
//2.调用accapt()表明接收来自于客户端的socket
Socket socket = ss.accept();
//3.获取输入流
InputStream is = socket.getInputStream();
//不建议下面这种方式:因为可能会出现乱码
// byte[] buffer = new byte[20];
// int len;
// while((len=is.read(buffer))!=-1){
// String str = new String(buffer,0,len);
// System.out.println(str);
//读取输入流中的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[5];
int len;
while((len = is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
System.out.println("收到了来自"+ socket.getInetAddress().getHostAddress());
//5.关闭资源
baos.close();
is.close();
socket.close();
ss.close();
}
练习2:客户端发送文件给服务端,服务端将文件保存在本地
//例题2:客户端发送文件给服务端,服务端将文件保存在本地
public class TCPtest2 {
@Test
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
OutputStream os = socket.getOutputStream();
FileInputStream fis =new FileInputStream("小哀.jpg");
byte[]buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
fis.close();
os.close();
socket.close();
}
@Test
public void server() throws IOException {
ServerSocket ss = new ServerSocket(9090);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("小哀5.jpg"));
byte[]buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.close();
is.close();
socket.close();
ss.close();
}
练习3:从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功”到客户端,并关闭相应的连接
//例题3:从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功”到客户端,并关闭相应的连接
public class TCOtest3 {
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),21312);
OutputStream os = socket.getOutputStream();
FileInputStream fis =new FileInputStream("小哀.jpg");
byte[]buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//关闭数据的输出
socket.shutdownOutput();
//接收来自于服务器端的数据,并显示到控制台上
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bufferr = new byte[5];
int lenn;
while((lenn = is.read(bufferr))!=-1){
baos.write(bufferr,0,lenn);
}
System.out.println(baos.toString());
fis.close();
os.close();
socket.close();
baos.close();
}
@Test
public void server() throws IOException {
ServerSocket ss = new ServerSocket(21312);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("小哀6.jpg"));
byte[]buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//服务器端给予客户端反馈
OutputStream os = socket.getOutputStream();
os.write("你好,小哀,我已收到你的照片".getBytes());
fos.close();
is.close();
socket.close();
ss.close();
os.close();
}
//发送端,例子
@Test
public void sender() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我是UDP方式发射的导弹";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
socket.send(packet);
socket.close();
}
//接收端
@Test
public void receiver()throws IOException{
DatagramSocket socket = new DatagramSocket(9090);
byte[]buffer=new byte[100];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}
URL编程
可以分析一波,对后面的javaweb很有帮助