网络编程
java.net.InetAddress类:互联网ip地址统称
这个类没有构造方法,不能直接创建对象!,提供一些成员方法使用:静态的
Runtime类: 单例模式
提供静态方法,返回该类本身
public static InetAddress getByName(String host):
参数为:主机名称:
成员方法
public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
public String getHostName():获取主机名
网络编程的三要素
协议
网络协议
UDP和TCP
应用协议
http协议 smtp ftp
ip地址
端口号 有效端口号:0-65535
0-1024:保留端口号
常见端口号
tomcat: 8080
redis:6575.. (数据库---非关系型数据库 key-value )
mysql软件:3306
Socket编程:特点:
1)两端都需要有Socket对象
2)发送端/客户端:有对应ip地址和端口号
3)接收端/服务端:绑定对应的端口号
UDP协议发送端的步骤
package com. other_stream_udp;
import java. io. IOException;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class SendUDP {
public static void main ( String[ ] args) throws IOException {
DatagramSocket ds = new DatagramSocket ( ) ;
String s = "hello ....弟弟" ;
byte [ ] bytes = s. getBytes ( ) ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length,
InetAddress. getByName ( "10.12.156.194" ) , 10086 ) ;
ds. send ( dp) ;
ds. close ( ) ;
}
}
UDP协议接收端的实现步骤
package com. other_stream_udp;
import java. io. IOException;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class ReceiveUDP {
public static void main ( String[ ] args) throws IOException {
DatagramSocket ds = new DatagramSocket ( 10086 ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length) ;
ds. receive ( dp) ;
byte [ ] buf = dp. getData ( ) ;
int length2 = dp. getLength ( ) ;
InetAddress address = dp. getAddress ( ) ;
String ip = address. getHostAddress ( ) ;
String s = new String ( buf, 0 , length2) ;
System. out. println ( "data is: " + s+ ",from " + ip) ;
}
}
udp发送端键盘录入数据,接收端不断接受数据(不关闭)
package com. udp. udp_01;
import java. io. BufferedReader;
import java. io. IOException;
import java. io. InputStreamReader;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class SendDemo {
public static void main ( String[ ] args) throws IOException {
DatagramSocket ds = new DatagramSocket ( ) ;
BufferedReader br = new BufferedReader (
new InputStreamReader ( System. in) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
byte [ ] bytes = line. getBytes ( ) ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length,
InetAddress. getByName ( "10.12.156.190" ) , 10000 ) ;
ds. send ( dp) ;
}
ds. close ( ) ;
}
}
package com. udp. udp_01;
import java. io. IOException;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class ReceiveDemo {
public static void main ( String[ ] args) throws IOException {
DatagramSocket ds = new DatagramSocket ( 10000 ) ;
while ( true ) {
byte [ ] bytes = new byte [ 1024 ] ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length) ;
ds. receive ( dp) ;
byte [ ] buf = dp. getData ( ) ;
int length2 = dp. getLength ( ) ;
InetAddress address = dp. getAddress ( ) ;
String ip = address. getHostAddress ( ) ;
String s = new String ( buf, 0 , length2) ;
System. out. println ( "data is" + s+ ",from " + ip) ;
}
}
}
在一个窗口下聊天: 多线程,发送端开启发送端线程 接收端开启接收端线程
package com. udp. udp_02;
import java. net. DatagramSocket;
import java. net. SocketException;
public class ChatRoom {
public static void main ( String[ ] args) {
try {
DatagramSocket ds1 = new DatagramSocket ( ) ;
DatagramSocket ds2 = new DatagramSocket ( 10000 ) ;
SendThread st = new SendThread ( ds1) ;
ReceiveThread rt = new ReceiveThread ( ds2) ;
Thread t1 = new Thread ( st) ;
Thread t2 = new Thread ( rt) ;
t1. start ( ) ;
t2. start ( ) ;
} catch ( SocketException e) {
e. printStackTrace ( ) ;
}
}
}
package com. udp. udp_02;
import java. io. BufferedReader;
import java. io. IOException;
import java. io. InputStreamReader;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class SendThread implements Runnable {
private DatagramSocket ds;
public SendThread ( DatagramSocket ds) {
super ( ) ;
this . ds = ds;
}
@Override
public void run ( ) {
try {
BufferedReader br = new BufferedReader ( new InputStreamReader ( System. in) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
byte [ ] bytes = line. getBytes ( ) ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length, InetAddress. getByName ( "10.12.156.190" ) , 10000 ) ;
ds. send ( dp) ;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
} finally {
if ( ds != null) {
ds. close ( ) ;
}
}
}
}
package com. udp. udp_02;
import java. io. IOException;
import java. net. DatagramPacket;
import java. net. DatagramSocket;
import java. net. InetAddress;
public class ReceiveThread implements Runnable {
private DatagramSocket ds;
public ReceiveThread ( DatagramSocket ds) {
super ( ) ;
this . ds = ds;
}
@Override
public void run ( ) {
try {
while ( true ) {
byte [ ] bytes = new byte [ 1024 ] ;
int length = bytes. length;
DatagramPacket dp = new DatagramPacket ( bytes, length) ;
ds. receive ( dp) ;
byte [ ] buf = dp. getData ( ) ;
int length2 = dp. getLength ( ) ;
InetAddress address = dp. getAddress ( ) ;
String ip = address. getHostAddress ( ) ;
String s = new String ( buf, 0 , length2) ;
System. out. println ( "data is: " + s + ",from " + ip) ;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}
TCP的基本使用
客户端 Scoket
服务器端: ServerScoket
需要有一种通道内流: 客户端写数据到服务器端,服务器端解析数据(读取数据)
OutputStream InputStream
客户端不断发送数据,服务器端不断接收 展示数据
客户端的某个文件文本,服务器端复制文本文件
TCP客户端的实现步骤
package com. qianfeng. tcp_03;
import java. io. IOException;
import java. io. OutputStream;
import java. net. Socket;
import java. net. UnknownHostException;
public class ClientDemo {
public static void main ( String[ ] args) throws IOException {
Socket s = new Socket ( "10.12.156.36" , 8888 ) ;
OutputStream out = s. getOutputStream ( ) ;
out. write ( "你好...弟弟" . getBytes ( ) ) ;
s. close ( ) ;
}
}
TCP服务器端的实现步骤
package com. tcp. tcp_01;
import java. io. IOException;
import java. io. InputStream;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerDemo {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 10000 ) ;
Socket s = ss. accept ( ) ;
InputStream in = s. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int len = in. read ( bytes) ;
String clientStr = new String ( bytes, 0 , len) ;
String ip = s. getInetAddress ( ) . getHostAddress ( ) ;
System. out. println ( "数据是: " + clientStr+ "来源于" + ip) ;
ss. close ( ) ;
}
}
客户端发送数据,服务器将数据读取出来—服务器端反馈操作 ,客户端读取反馈信息
package com. tcp. tcp_02;
import java. io. IOException;
import java. io. InputStream;
import java. io. OutputStream;
import java. net. Socket;
public class ClientDemo {
public static void main ( String[ ] args) throws IOException {
Socket socket = new Socket ( "10.12.156.190" , 8888 ) ;
OutputStream out = socket. getOutputStream ( ) ;
out. write ( "你好,我是...." . getBytes ( ) ) ;
InputStream in = socket. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int len = in. read ( bytes) ;
String serverStr = new String ( bytes, 0 , len) ;
System. out. println ( serverStr) ;
socket. close ( ) ;
}
}
package com. tcp. tcp_02;
import java. io. IOException;
import java. io. InputStream;
import java. io. OutputStream;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerDemo {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 ) ;
Socket socket = ss. accept ( ) ;
InputStream in = socket. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int len = in. read ( bytes) ;
String clientStr = new String ( bytes, 0 , len) ;
System. out. println ( clientStr) ;
OutputStream out = socket. getOutputStream ( ) ;
out. write ( "数据已经收到了" . getBytes ( ) ) ;
ss. close ( ) ;
}
}
客户端键盘录入数据,服务器端不断将数据展示在控制台上
package com. tcp. tcp_03;
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 ClientTest {
public static void main ( String[ ] args) throws IOException {
Socket socket = new Socket ( "10.12.156.190" , 8888 ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( System. in) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
socket. close ( ) ;
}
}
package com. tcp. tcp_03;
import java. io. BufferedReader;
import java. io. IOException;
import java. io. InputStream;
import java. io. InputStreamReader;
import java. io. OutputStream;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerTest {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 ) ;
Socket socket = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( socket. getInputStream ( ) ) ) ;
String line = null ;
while ( ( line= br. readLine ( ) ) != null) {
System. out. println ( line) ;
}
}
}
客户端不断键盘录入数据,服务器端将数据输出在某个文件中
package com. tcp. tcp_04;
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 ClientTest {
public static void main ( String[ ] args) throws IOException {
Socket socket = new Socket ( "10.12.156.190" , 8888 ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( System. in) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
socket. close ( ) ;
}
}
package com. tcp. tcp_04;
import java. io. BufferedReader;
import java. io. BufferedWriter;
import java. io. FileWriter;
import java. io. IOException;
import java. io. InputStreamReader;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerTest {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 ) ;
Socket socket = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( socket. getInputStream ( ) ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "a.txt" ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
bw. close ( ) ;
ss. close ( ) ;
}
}
客户端将文件写入到通道内的流中,服务器端将客户端的文件复制到另一个文件中
package com. tcp. tcp_05;
import java. io. BufferedReader;
import java. io. BufferedWriter;
import java. io. FileReader;
import java. io. IOException;
import java. io. OutputStreamWriter;
import java. net. Socket;
public class ClientTest {
public static void main ( String[ ] args) throws IOException {
Socket socket = new Socket ( "10.12.156.190" , 8888 ) ;
BufferedReader br = new BufferedReader ( new FileReader ( "ServerDemo.java" ) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
br. close ( ) ;
socket. close ( ) ;
}
}
package com. tcp. tcp_05;
import java. io. BufferedReader;
import java. io. BufferedWriter;
import java. io. FileWriter;
import java. io. IOException;
import java. io. InputStreamReader;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerTest {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 ) ;
Socket socket = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( socket. getInputStream ( ) ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "a.java" ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
bw. close ( ) ;
ss. close ( ) ;
}
}
客户端将文件写入到通道内的流中,服务器端将客户端的文件复制到另一个文件中–加入反馈
package com. tcp. tcp_06;
import java. io. BufferedReader;
import java. io. BufferedWriter;
import java. io. FileReader;
import java. io. IOException;
import java. io. InputStreamReader;
import java. io. OutputStreamWriter;
import java. net. Socket;
public class ClientTest {
public static void main ( String[ ] args) throws IOException {
Socket socket = new Socket ( "10.12.156.190" , 8888 ) ;
BufferedReader br = new BufferedReader ( new FileReader ( "ServerDemo.java" ) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
if ( line. equals ( "88" ) ) {
break ;
}
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
socket. shutdownOutput ( ) ;
BufferedReader br2 = new BufferedReader ( new InputStreamReader ( socket. getInputStream ( ) ) ) ;
String s = br2. readLine ( ) ;
System. out. println ( s) ;
br. close ( ) ;
socket. close ( ) ;
}
}
package com. tcp. tcp_06;
import java. io. BufferedReader;
import java. io. BufferedWriter;
import java. io. FileWriter;
import java. io. IOException;
import java. io. InputStreamReader;
import java. io. OutputStreamWriter;
import java. net. ServerSocket;
import java. net. Socket;
public class ServerTest {
public static void main ( String[ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 ) ;
Socket socket = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( socket. getInputStream ( ) ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "a.java" ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
BufferedWriter bw2 = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
bw2. write ( "文件复制完毕" ) ;
bw2. newLine ( ) ;
bw2. flush ( ) ;
bw2. close ( ) ;
bw. close ( ) ;
ss. close ( ) ;
}
}
客户端将图片写入到通道内的流中,服务器端将图片复制到另一个图片文件中–加入反馈
package com.qianfeng.tcp_09;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
/*
图片的复制:BufferedInputStream/BufferedOutputStream
客户端的一个图片文件 当前项目下 123.png
服务器端将图片文件进行复制 mv.png
加入服务器的反馈
发现问题:
图片文件:没有复制完整,图片文件缺失(少字节数)
图片文件本身在内存中:缓存数据!
字节缓冲输出流中:public void flush():强制将缓冲的字节数输出到流中!
*/
public class UploadImageClient {
public static void main(String[] args) throws IOException {
//创建Scoket
Socket s = new Socket("10.12.156.190",6666) ;
//创建字节输入流:封装图片文件
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("123.png")) ;
//封装通过的字节输出流
BufferedOutputStream bos = new BufferedOutputStream(
s.getOutputStream()) ;
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1) {
bos.write(bytes, 0, len);
//刷新
bos.flush();
}
//告诉服务器端,图片文件已经全部写入到输出流中,不要等待了
s.shutdownOutput();
//读取服务端反馈数据
//获取通道内的字节输入流
InputStream in = s.getInputStream() ;
//一次读取一个字节数组
byte[] bytes2 = new byte[1024] ;
int len2 = in.read(bytes2) ;
String str = new String(bytes2, 0, len2) ;
System.out.println(str);
//释放资源
bis.close();
s.close();
}
}
package com.qianfeng.tcp_09;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadImageServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666) ;
Socket socket = ss.accept() ;
//封装通道内在字节输入流
BufferedInputStream bis = new BufferedInputStream(
socket.getInputStream()) ;
//输出到指定文件
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("mv.png")) ;
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = bis.read(bytes))!=-1) {
//写入
bos.write(bytes, 0, len);
//强制刷新
bos.flush();
}
//加入反馈
//获取通道内的输出流
OutputStream out = socket.getOutputStream() ;
out.write("图片已经复制完毕".getBytes());
//刷新
out.flush();
//释放资源
bos.close();
socket.close();
}
}