1.InetAdress类 与 Socket类
>InetAdress
>Socket
2.TCP/IP协议簇
客户端:
- 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
- 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
- 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
- 关闭 Socket:断开客户端到服务器的连接,释放线路
服务器端:
public class TestTCP3 {
@Test
public void client()throws Exception{
//1.创建Socket的对象
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9898);
//2.从本地获取一个文件发送给服务端
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("1.jpg"));
byte[] b = new byte[1024];
int len;
while((len = fis.read(b)) != -1){
os.write(b,0,len);
}
socket.shutdownOutput();//告知服务器端传送完毕
//3.接收来自于服务端的信息
InputStream is = socket.getInputStream();
byte[] b1 = new byte[1024];
int len1;
while((len1 = is.read(b1)) != -1){
String str = new String(b1,0,len1);
System.out.print(str);
}
//4.关闭相应的流和Socket对象
is.close();
os.close();
fis.close();
socket.close();
}
@Test
public void server() throws Exception{
//1.创建一个ServerSocket的对象
ServerSocket ss = new ServerSocket(9898);
//2.调用其accept()方法,返回一个Socket的对象
Socket s = ss.accept();
//3.将从客户端发送来的信息保存到本地
InputStream is = s.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("3.jpg"));
byte[] b = new byte[1024];
int len;
while((len = is.read(b)) != -1){
fos.write(b, 0, len);
}
System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的文件");
//4.发送"接收成功"的信息反馈给客户端
OutputStream os = s.getOutputStream();
os.write("你发送的图片我已接收成功!".getBytes());
//5.关闭相应的流和Socket及ServerSocket的对象
os.close();
fos.close();
is.close();
s.close();
ss.close();
}
}
3.UDP网络通信
- 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
- 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
- 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
//UDP编程的实现
public class TestUDP { // 发送端
@Test
public void send() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
byte[] b = "你好,我是要发送的数据".getBytes();
//创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到
//的接收端的IP、端口号。
DatagramPacket pack = new DatagramPacket(b, 0, b.length,
InetAddress.getByName("127.0.0.1"), 9090); ds.send(pack);
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(ds != null){
ds.close(); }
} } // 接收端
@Test
public void rceive() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(9090);
byte[] b = new byte[1024];
DatagramPacket pack = new DatagramPacket(b, 0, b.length);
ds.receive(pack); String str = new String(pack.getData(), 0, pack.getLength());
System.out.println(str);
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(ds != null){
ds.close(); }
}
}
}
附上http请求:
l URL的方法 openStream():能从网络上读取数据
l 若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
l URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.
- URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
- URLConnectonn u = netchinaren.openConnection( );