黑马程序员--Java面向对象——(网络编程)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! 

面向对象

(网络编程:概述)


1、网络模型

(1)OSI参考模型

(2)TCP/IP参考模型

2、网络通讯要素

(1)IP地址(InetAddress已经封装成了对象)

1、网络中设备的标识
2、不易记忆,可用主机名
3、本地IP地址:127.0.0.1 主机名:Localhost。

(2)端口号(数字标识,没有必要封装成对象)

1、用于标识进程的逻辑地址,不同进程的标识。
2、有效端口:0~65535,其中0~1024系统使用或保留端口。

(3)传输协议

1、通讯的规则。
2、常见协议:TCP,UDP。

3、网络通讯过程

(1)找到对方 IP。

(2)数据要发到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行了标识。为了方便称呼这个数字,叫做端口。(逻辑端口)

了解:Ping 127.0.0.1(LocalHost)可以查看网卡是否异常。

(网络编程-IP地址)

由于IP地址是一个复杂的事物,Java已经它封装成了对象,封装成了对象把复杂的事情简单化。

类 InetAddress

static InetAddressgetLocalHost()
          返回本地主机。
 StringgetHostAddress()
          返回 IP 地址字符串(以文本表现形式)。
 StringgetHostName()
          获取此 IP 地址的主机名。

static InetAddressgetByName(String host)
          在给定主机名的情况下确定主机的 IP 地址。

import java.net.InetAddress;
public class  Test{

public static void main(String... args) throws Exception{

InetAddress i = InetAddress.getLocalHost();

String ip = i.getHostAddress();

String hostName = i.getHostName();

//System.out.println("IP地址"+ip);

//System.out.println("主机名"+hostName);

InetAddress inetAddress = InetAddress.getByName("www.baidu.com");

System.out.println(inetAddress.getHostAddress());

System.out.println(inetAddress.getHostName());

/*

InetAddress[] hosts = InetAddress.getAllByName("www.baidu.com");

for(InetAddress host :hosts ){

System.out.println(host.getHostAddress());

System.out.println(host.getHostName());

}

*/

}

}

(网络编程-UDP-TCP)

UDP 特点:(面向无连接)(聊天)

1、将数据及源和目的封装成数据包中,不需要建立连接。(封包,无连接)
2、每个数据包的大小限制在64k内。(小数据)
3、因无连接,是不可靠协议。(不可靠,丢数据)
4、不需要建立连接,速度快。(速度快)

TCP 特点:(面向连接)(下载)

1、建立连接,形成传输数据的通道。(传输,连接)
2、在连接中进行大数据量传输。(大数据)
3、通过三次捂手完成连接,是可靠协议。(可靠。在? 我在!我知道你在了)
4、必须建立连接,效率会稍低。(速度慢)

(网络编程-Socket)(Socket也称套接字)

1、Socket就是为网络服务提供的一种机制。
2、通信的两端都有Socket
3、网络通信其实就是Socket间的通信。
4、数据在两个Socket间通过IO传输。

注意:Socket可以理解为码头,有码头才有船可以对货(数据)进行装卸(读写)。

但是由于船运输的方式不同,所以有了不同的服务方式。

一个是UDP,另外一个是TCP。

(网络编程-UDP传输)应用小程序

import java.net.InetAddress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
/*
需求:

通过udp传输方式,将一段文字数据发送出去。

思路:

1.建立udpSocket服务。

2.提供数据,并将数据封装到数据包中。

3.通过Socket服务的发送功能,将数据包发送出去。

4.关闭资源。

*/
class UdpSend{

public static void main(String...args)throws Exception{

//1.创建udp服务,通过DatagramSocket对象。

DatagramSocket ds =new DatagramSocket (888);


//2.确定数据,并封装成数据包。

//DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

byte[] buf ="黑马程序员——哥们来了".getBytes();

DatagramPacketdp = 

new DatagramPacket(

buf,

buf.length,

InetAddress.getByName("192.168.9.101"),

10000);


//3.通过socket服务,将已有的数据包发送出去,通过Send方法。

ds.send(dp);


//4.关闭资源。

ds.close();

}

}
/*
需求:

定义一个应用程序,用于接收udp协议传输的数据并处理。

思路:

1.建立udpSocket服务。

2.建立一个数据包,用于存储监听到的端口的数据。

把接收到的数据封装的数据包,就可以操作数据包对象,

使用其更多的功能对接收到的数据进行更多的操作。

3.通过Socket服务的监听功能,

将接收到的数据存入到已经定义好的数据包中。

4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。

5.关闭资源。

*/
class UdpRece{

public static void main(String...args) throws Exception{

//1.创建udp的Socket服务,建立端点。

DatagramSocket ds =new DatagramSocket(10000);


//2.预定义数据包,用于存储接收数据。

byte[] buf =new byte[1024];

DatagramPacket dp = new DatagramPacket(buf,buf.length);


//3.通过服务的receive方法,将收到的数据存入到定义好的数据包中。

ds.receive(dp);


//4.通过数据包中的方法获取其中的数据。

String ip = dp.getAddress().getHostAddress();

int port = dp.getPort();

String data = new String(dp.getData(),0,dp.getLength());

System.out.println("IP地址:"+ip+"..."+data+"...端口:"+port);


//5.关闭资源。

ds.close();

}

}

注意:receive方法有一个阻塞式方法,如果发送端没有进行数据传输,那么该线程就是等,

如果有数据进行传输,那么就会接收发送端的数据并封装进数据包。

send方法如果接收端没有开启,数据将会丢失,但是数据是已经发送出去了的,只是丢失了。

(网络编程——UDP群聊小程序)

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.InetAddress;

import java.net.DatagramSocket;

import java.net.DatagramPacket;

public class Test {
public static void main(String[] args) throws Exception{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10000);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
class Send implements Runnable{
private DatagramSocket ds ;
public Send(DatagramSocket ds){
this.ds=ds;
}
public void run(){
BufferedReader bufr = null;
try{
String line =null;
bufr =new BufferedReader(new InputStreamReader(System.in));
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,
buf.length,
InetAddress.getByName("192.168.9.255"),
10000 );
ds.send(dp);
}
}
catch(Exception e){
throw new RuntimeException("发送端失败");
}
finally{
if(bufr!=null){
try {
bufr.close();
}
catch (Exception e) {
throw new RuntimeException("读取关闭失败");
}
}
}
ds.close();
}
}
class Rece implements Runnable{
private DatagramSocket ds ;
public Rece(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
while(true){
byte[] buf =new byte[1024];
DatagramPacket dp = new  DatagramPacket (buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data =new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
}
}
catch (Exception e){
throw new RuntimeException("接收端失败");
}
}

}

(网络编程-TCP传输)
1、SocketServerSocket。
2、建立客户端和服务器端。
3、建立连接后,通过Socket中的IO流进行数据的传输。
4、关闭Socket。

同样,客户端和服务器端是两个独立的应用程序


/*
演示Tcp传输

1、Tcp分客户端和服务端
2、客户端对应的是Socket,服务端对应的是ServerSocket
客户端

通过查阅 Socket 对象,发现在该对象建立时,就可以去连接指定主机

因为Tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输

步骤:

1、创建Socket服务,并制定要连接的主机和端口。

需求:给服务端发送一个文本数据

通过图例发现:服务端需要一直开着,或者关闭。那么服务器的资源可以关闭,也可以24小时开启。

*/

import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStream;
import java.io.OutputStream;
class TcpClient{

public static void main(String...args) throws Exception{

//创建客户端的socket服务。指定目的主机和端口

Socket s = new Socket("192.168.1.109",10003);


//为了发送数据,应该获取socket流中的输出流。

OutputStream out = s.getOutputStream();

out.write("Tcp 黑马程序员 哥们来了".getBytes());

s.close();

}

}
/*
需求:定义端点接收数据并打印在控制台上。


服务端:

1,建立服务端的socket服务。ServerSocket();

并监听一个端口。

2,获取连接过来的客户端对象。

通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。

3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。


4,关闭服务端。(可选)


*/

class  TcpServer{

public static void main(String... args) throws Exception{

//建立服务端socket服务。并监听一个端口。

ServerSocket ss = new ServerSocket(10003);

//通过accept方法获取连接过来的客户端对象。

while(true){

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+".....连接成功");

//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。

InputStream in = s.getInputStream();

byte[] buf = new byte[1024];

int len = in.read(buf);

System.out.println(new String(buf,0,len));

s.close();//关闭客户端.服务

}

//ss.close();//关闭服务端资源,可选可不选

}

}

(网络通讯——Tcp服务端客户端互动)

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
/*
思路:

1.创建客户端服务。并指定需要连接的主机与端口。

2.获取客户端中的输出流,将数据写入流中。

3.获取客户端中的输入流,将服务端反馈的数据进行读取。

4.关闭资源。

*/
class Cilent{

public static void main(String...args) throws Exception{

Socket s = new Socket("127.0.0.1",10000);

OutputStream out = s.getOutputStream();

out.write("服务端你好".getBytes());

InputStream in = s.getInputStream();

byte[]buf =new byte[1024];

int len = in.read(buf);

System.out.println(new String(buf,0,len));

s.close();

}

}
/*
思路:

1.建立服务端服务。并监听一个端口。

2.获取连接进来的客户端对象。

3.获取客户端的读取流,读取客户端流中的数据。

4.给客户端回馈一个信息,获取客户端中的输入流,将数据写入流中。

5.关闭连接进来的客户端对象。

6.关闭客户资源(必选)关闭服务端资源(可选)

*/
class Server{

public static void main(String...args) throws Exception{

ServerSocket ss = new ServerSocket(10000);

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+"...连接成功");

InputStream in = s.getInputStream();

byte[] buf = new byte[1024];

int len = in.read(buf);

System.out.println(new String(buf,0,len));

OutputStream out = s.getOutputStream();

Thread.sleep(10000);

out.write("客户端你也好".getBytes());

s.close();//必需的

ss.close();//可选

}

}

(网络编程——模拟一个翻译软件)

其实这个还不是翻译软件,只是我觉得跟翻译软件类似,日后我们把数据发送到数据库,而数据库返回的应该就是翻译后的结果。

/*

需求:建立一个文字转换服务器。
客户端给服务端发送文字,服务单会将文字转成大写在返回给客户端。
而且客户度可以不断的进行文字转换。当客户端输入over时,转换结束。


客户端:
1.建立客户端服务。并指定主机和端口。
2.获取键盘录入。纯文本,用到字符流。
3.获取客户端的输出流,将键盘录入的数据写入客户端的输出流中。
4.定义循环结束标记,因为键盘录入无法停下。
3.读取服务端反馈的数据。
4.关闭客户端资源。
*/
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.ServerSocket;
class TransClient {
public static void main(String...args)throws Exception{
Socket s = new Socket("127.0.0.1",10000);

BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));

/*

BufferedWriter bufout =

new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

*/

PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

BufferedReader bufin =
new BufferedReader(new InputStreamReader(s.getInputStream()));

String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;

pw.println(line);


//bufout.write(line);
//bufout.newLine();
//bufout.flush();
String str = bufin.readLine();
System.out.println(str);
}
bufr.close();
s.close();
}
}
/*
服务端:
1.创建服务端服务。并监听一个端口
2.获取客户端对象。
3.读取客户端中的输入流,将数据读取出来。
4.给客户端回馈信息,将客户端的数据进行大写转换。
5.获取客户端的输出流,将数据发送给客户端。
6.关闭客户端资源。关闭服务端资源。
*/
class TransServer{
public static void main(String...args) throws Exception{
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
BufferedReader bufin =
new BufferedReader(new InputStreamReader(s.getInputStream()));

/*

BufferedWriter bufout =

new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

*/

PrintWriter pw = new PrintWriter(s.getOutputStream(),true);


String line =null;
while((line=bufin.readLine())!=null){
System.out.println(line);

pw.println("Server:"+line.toUpperCase());
//bufout.write("server:"+line.toUpperCase());
//bufout.newLine();
//bufout.flush();
}
s.close();
ss.close();
}

}

/*

键盘录入读取的标识是换行符。

服务端停止的原来是客户端键盘录入结束,服务端读到了标记-1,所以结束。

read方法是阻塞式的。

accept方法也是阻塞式的。

阻塞式的方法只要没有读到所属的数据就是等。

*/

(网络编程——上传文本)

/*
需求:
将客户端的一个文本文件上传到服务端去.

客户端:

1.建立客户端服务,并指定一个主机和端口。

2.获取客户端的输出流对象,把数据写入流中。

3.获取客户端的输入流,读取服务端的反馈信息。

4.关闭资源。

*/
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.Socket;
import java.net.ServerSocket;
class TextClient{

public static void main(String...args) throws Exception{

Socket s = new Socket("127.0.0.1",10000);

BufferedReader bufr = 

new BufferedReader(new FileReader("C:\\1.txt"));

PrintWriter out = new PrintWriter(s.getOutputStream(),true);

String line =null;

while((line=bufr.readLine())!=null){

out.println(line);

}

s.shutdownOutput();//原理其实就是-1

BufferedReader in = 

new BufferedReader(new InputStreamReader(s.getInputStream()));

String len =null;

while((len=in.readLine())!=null){

System.out.println(len);

}

bufr.close();

s.close();

}

}
/*
服务端:

1.建立服务端服务,并监听一个端口。

2.获取客户端对象。

3.获取客户端输入流,将数据读取出来,并写入一个文件中,存入在D盘。

4.获取客户端的输出流,给客户端回馈点信息。

5.关闭资源。

*/
class TextServer{

public static void main(String...args)throws Exception{

ServerSocket ss = new ServerSocket(10000);

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+"....连接成功");

PrintWriter pw =new PrintWriter(new FileWriter("D:\\1.txt"),true);

BufferedReader in =

new BufferedReader(new InputStreamReader(s.getInputStream()));

String line = null;

while((line=in.readLine())!=null){

pw.println(line);

}

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

out.println("上传成功");

pw.close();

s.close();

ss.close();

}

}

(网络编程——上传图片文件)

/*
需求:

将客户端的图片文件上传到服务端去。(并考虑多个用户同时操作的情况)


客户端

1.创建客户端服务。并指定主机和端口。

2.读硬盘上的图片文件。

3.获取客户端的输出流,将图片文件写出去。

4.定义上传结束标记。

5.服务端给客户端反馈一个结果。

6.关闭流资源。关闭客户端资源。关闭服务端资源。

*/

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.File;

import java.net.Socket;

import java.net.ServerSocket;

class PicClient{

public static void main(String...args) throws Exception{

if(args.length!=1){

System.out.println("请选择一个jpg文件");

return;

}

File file = new File(args[0]);

if(!file.getName().endsWith(".jpg")){

System.out.println("文件格式错误,不是jpg");

return ;

}

if(!(file.exists() && file.isFile())){

System.out.println("该文件有问题,要么不存在,要么不是文件");

return ;

}

if(file.length()>1024*1024*5){

System.out.println("文件过大,无法处理");

return ;

}

Socket s = new Socket("127.0.0.1",10000);

FileInputStream fis = new FileInputStream(file);

OutputStream out = s.getOutputStream();

byte[]bufout = new byte[1024];

int by = 0;

while((by=fis.read(bufout))!=-1){

out.write(bufout,0,by);

}

s.shutdownOutput();

InputStream in = s.getInputStream();

byte[] bufin =new byte[1024];

int len = in.read(bufin);

System.out.println(new String(bufin,0,len));

fis.close();

s.close();

}

}
/*
服务端:
1.创建服务端服务,并监听一个端口。
2.获取客户端对象。
3.获取客户端的输入流,将传输的数据存储到硬盘中。
4.存储成功则给客户端回馈上传成功,否则上传失败。
5.关闭流资源。关闭客户端资源。关闭服务端资源。
*/

class PicThread implements Runnable{

private Socket s;

PicThread(Socket s){

this.s=s;

}

public void run(){

String ip = s.getInetAddress().getHostAddress();
int count = 1;

try{

System.out.println(ip+"...连接进来了");
File file = new File("D:\\Pic\\"+ip+"("+(count)+").jpg");
while(file.exists())

file = new File("D:\\Pic\\"+ip+"("+(count++)+").jpg");

FileOutputStream fos = new FileOutputStream(file);

InputStream in = s.getInputStream();

byte [] buf =new byte[1024];

int by = 0;

while((by=in.read(buf))!=-1){

fos.write(buf,0,by);

}

OutputStream out = s.getOutputStream();

out.write("上传成功".getBytes());

fos.close();

s.close();

}

catch(Exception e){

throw new RuntimeException("图片上传失败");

}

}

}
class PicServer{

public static void main(String...args) throws Exception{

ServerSocket ss = new ServerSocket(10000);

while(true){

Socket s = ss.accept();

new Thread(new PicThread(s)).start();

}

}

}

/*

客户端通过键盘录入用户名。

服务端对这个用户名进行校验。


如果该用户存在,在服务端显示xxx,已登陆。

并在客户端显示 xxx,欢迎光临。


如果该用户存在,在服务端显示xxx,尝试登陆。

并在客户端显示 xxx,该用户不存在。

最多就登录三次。


客户端:

1.建立客户端服务,并指定主机和端口。

2.通过键盘录入一个用户名。最多三次输入。

3.获取客户端输出流将键盘录入的用户名发送到服务端去。

4.通过客户端输入流,读取服务反馈的信息,如果服务端反馈信息是

用户成功登录,那么就退出循环。否则则继续输入。

5.关闭资源。

服务端:

1.建立服务端服务,并监听一个端口。

2.获取客户端对象。

3.通过客户端输入流接收客户端发送过来的用户名。最多三次验证。

4.对用户名进行验证,如果该用户名在数据库存在,

那么给客户端回馈一个欢迎光临的信息。

如果不存在,那么将回馈一个用户不存在的信息。

5.关闭资源。

*/

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

class Client {

public static void main(String... args) throws Exception{


Socket s = new Socket("192.168.9.101",10047);


BufferedReader bufr = 

new BufferedReader(new InputStreamReader(System.in));


PrintWriter out = new PrintWriter(s.getOutputStream(),true);

BufferedReader bufIn =

new BufferedReader(new InputStreamReader(s.getInputStream()));

for (int x = 0; x < 3; x++) {

String line = bufr.readLine();

if(line ==null)

break;

out.println(line);

String info = bufIn.readLine();

System.out.println("info:"+ info);

if(info.contains("欢迎"))

break;

}

bufr.close();

s.close();

}

}

class UserThread implements Runnable {

private Socket s;

UserThread(Socket s) {

this.s = s;

}

public void run() {

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip +"....连接成功");

try{

for (int x = 0; x < 3; x++) {

BufferedReader bufIn =

new BufferedReader(new InputStreamReader(s.getInputStream()));

String name = bufIn.readLine();

if(name ==null)

break;

BufferedReader bufr =

new BufferedReader(new FileReader("C:\\user.txt"));

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

String line =null;

boolean flag = false;

while ((line = bufr.readLine()) !=null) {

if (line.equals(name)) {

flag =true;

break;

}

}

if(flag) {

System.out.println(name +"...已登录");

out.println(name + "...欢迎光临");

break;

else {

System.out.println(name +"...尝试登录");

out.println(name + "...用户名不存在");

}
}
s.close();

catch (Exception e) {

throw new RuntimeException(ip + "校验失败");
}
}

}

class Server {

public static void main(String... args) throws Exception {

ServerSocket ss = new ServerSocket(10047);

while(true) {

Socket s = ss.accept();

new Thread(new UserThread(s)).start();

}

}

}

网络通讯-浏览器交互)

/*

演示客户端和服务端

客户端:浏览器

服务端:自定义

*/

import java.io.PrintWriter;

import java.net.ServerSocket;

public class Test{

public static void main(String...args) throws Exception{

ServerSocket ss = new ServerSocket(10005);

while(true){

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+"...连接成功");

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

out.println("<font size=8 color=red>客户端你好</font>");

s.close();

}

}

}

telnet 命令 相当于一个客户端 在dos命令行输出 telnet 主机IP 端口

(网络通讯-Tomcat)

/*

客户端:浏览器

服务端:Tomcat服务器

*/

import java.io.PrintWriter;

import  java.net. ServerSocket ;

public class Test{

public static void main(String...args) throws Exception{

ServerSocket ss = new ServerSocket(11000);

while(true){

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+"...连接成功");

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

out.println("<font size=8 color=red>客户端你好</font>");

s.close();

}

}

}





(网络通讯——Tomcat)

/*

客户端:自定义

服务端:Tomcat服务器

获取浏览器给Tomcat服务器发送了什么请求呢?

*/

import java.io.PrintWriter;

import java.io.InputStream;

import  java.net. ServerSocket ;

public class Test{

public static void main(String...args) throws Exception{

ServerSocket ss = new ServerSocket(10005);

while(true){

Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();

System.out.println(ip+"...连接成功");

InputStream in = e.getInputStream();

byte[] buf =new byte[1024];

int len = in.read(buf):

System.out.println(new String(buf,0,len));

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

out.println("<font size=8 color=red>客户端你好</font>");

s.close();

}

}

}


/*

(获取连接客户端的IP地址)

192.168.9.101...连接成功

GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gi
f, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zu,zh-CN;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.
0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Cent
er PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: 192.168.9.101:11000
Connection: Keep-Alive


请按任意键继续. . .

*/



/*
自定义客户端
客户端:自定义
服务器:Tomcat
*/

import java.io.PrintWriter;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.Socket;

public class Test{

public static void main(String...args)throws Exception{

Socket s = new Socket("127.0.0.1",8080);

PrintWriter out =new PrintWriter(s.getOutputStream(),true);

out.println("GET /Web/index.html HTTP/1.1");

out.println("Accept: */*");

out.println("Accept-Language: zh-cn");

out.println("Host: 192.168.9.101:11000");

out.println("Connection: closed");

out.println();

out.println();

BufferedReader bufr = 

new BufferedReader(new InputStreamReader(s.getInputStream()));

String  line = null ;

while((line=bufr.readLine())!=null){

System.out.println(line);

}

s.close();

}

}

/*
(获取连接客户端的IP地址)
192.168.9.101...连接成功
GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gi
f, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zu,zh-CN;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.
0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Cent
er PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: 192.168.9.101:11000
Connection: Keep-Alive


请按任意键继续. . .
*/


(网络编程——自定义图形界面浏览器-Tomcat服务端

这里先放放。因为消息头无法去掉。等下学完URLConnection先来一个图形化界面浏览器。

(网络编程——URL)

地址链接是一个复杂的事物,所以Java已经把地址链接封装成URL对象,方便了我们的操作。

我们只要操作URL对象的方法,就可以拿到URL的数据了。

import java.net.URL;

public class Test{

public static void main(String...args)throws Exception{

URL url =new URL("http://127.0.0.1:8080/Web/index.html?姓名=黑马程序员——新长城&年龄=20");

String protocol = url.getProtocol();

String path = url.getPath();

String host = url.getHost();

int port = url.getPort();//如果不指定端口,返回的是-1

String file = url.getFile();

String query = url.getQuery();//用?号隔开。获取地址栏的参数,如果多参数用&符号隔开

//if(port==-1)

//port=80;

//System.out.println(protocol+"://"+host+":"+port+path);

System.out.println(protocol);

System.out.println(host);

System.out.println(port);

System.out.println(path);

System.out.println(file);

System.out.println(query);

}
}

(网络编程——URLConnection)

/*

远程连接对象。

底层封装了Socket对象,调用的是Socket对象的读取流方法。

*/

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

public class Test{

public static void main(String...args)throws Exception{

URL url =new URL("http://www.so.com/");

URLConnection urlconnection = url.openConnection();

InputStream in = urlconnection.getInputStream();

byte[]buf =new byte[1024];

int len = in.read(buf);

System.out.println(new String(buf,0,len,"utf-8"));

}

}

(网络编程——openStream)

底层其实调用的是远程连接对象,直接调用远程连接对象的Socket流中的读取流方法。

更加方便我们的应用。

(网络编程——自定义图形界面浏览器-Tomcat服务端

现在自己去一步一步自己实现,可能晚上才发布。因为难嘛。

import java.awt.Button;

import java.awt.FlowLayout;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.TextField;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.InputStream;

import java.net.URL;

public class Test{

private Frame f;

private TextField tf;

private Button b;

private TextArea ta;

Test(){

init();

}

public void init(){

f = new Frame("MyIE");

tf = new TextField(70);

b = new Button("搜索一下");

ta =new TextArea(25,80);

b.setSize(20,30);

f.setBounds(0,200,1024,500);

f.setLayout(new FlowLayout());

f.add(tf);

f.add(b);

f.add(ta);

myEvent();

f.setVisible(true);

}

public void myEvent(){

b.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

ta.setText("");

try{

URL url = new URL(tf.getText());

InputStream in = url.openStream();


byte[]buf =new byte[1024];

int len = in.read(buf);

ta.setText(new String(buf,0,len,"gbk"));


}

catch (Exception ex){

ta.setText("输入错误,请重新输入");

}

}

});

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

}

public static void main(String...args){

new Test();

}

}

/*花了15分钟,哎真累,吃饭先*/

(网络编程——域名解析)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值