黑马程序员-day24-网络编程(下)

------- android培训java培训、期待与您交流! ----------

TCP传输
1.Socket和ServerSocket
2.建立客户端和服务器端
3.建立连接后,通过Socket中的IO流进行数据的传输
4.关闭socket
同样,客户端与服务器端是两个独立的应用程序。

 

TCP传输实例:

/*
演示tcp传输。
1.tcp分客户端和服务端。
2.客户端对应的对象是Socket。
	服务端对应的对象是ServerSocket。
*/
/*
客户端,
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
需求:给服务端发送给一个文本数据。
步骤:
1.创建Socket服务。并指定要连接的主机和端口。
*/
import java.io.*;
import java.net.*;
class  TcpClient{
	public static void main(String[] args) throws Exception {
		//创建客户端的socket服务。指定目的主机和端口
		Socket s = new Socket("192.168.1.254",10003);
		
		//为了发送数据,应该获取socket流中的输出流。
		OutputStream out = s.getOutputStream();

		out.write("tcp ge men lai le ".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+".....connected");

		//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
		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();
	}
}

 

基本思路(客户端)
1.客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
2.连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。
3.与服务端通讯结束后,关闭Socket。

 

基本思路(服务端)
1.服务端需要明确它要处理的数据是从哪个端口进入的。
2.当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
3.当该客户端访问结束,关闭该客户端。


客户端
通过Socket建立对象并指定要连接的服务端主机以及端口。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();

服务端
建立服务端需要监听一个端口
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();

 

Tcp传输最容易出现的问题
1.客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:
2.因为read方法或者readLine方法是阻塞式。
3.解决办法:
 自定义结束标记
 使用shutdownInput,shutdownOutput方法。


自定义图形界面浏览器-Tomcat服务端

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class  MyIEByGUI{
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	
	private Dialog d;
	private Label lab;
	private Button okBut;


	MyIEByGUI(){
		init();
	}
	public void init(){
		f = new Frame("my window");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf = new TextField(60);

		but = new Button("转到");

		ta = new TextArea(25,70);


		d = new Dialog(f,"提示信息-self",true);
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		lab = new Label();
		okBut = new Button("确定");

		d.add(lab);
		d.add(okBut);

		f.add(tf);
		f.add(but);
		f.add(ta);


		myEvent();
		f.setVisible(true);
	}
	private void  myEvent(){
		okBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				d.setVisible(false);
			}
		});
		d.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				d.setVisible(false);
			}
		});

		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				try{
						if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
				}
				catch (Exception ex){
				}
			
			}
		});


		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				try{
					showDir();
				}catch (Exception ex){
				}	
			}
		});

		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);	
			}
		});
	}

	private void showDir()throws Exception{
		ta.setText("");
		String url = tf.getText();//http://192.168.1.254:8080/myweb/demo.html
		
		int index1 = url.indexOf("//")+2;

		int index2 = url.indexOf("/",index1);



		String str = url.substring(index1,index2);
		String[] arr = str.split(":");
		String host = arr[0];
		int port = Integer.parseInt(arr[1]);

		String path = url.substring(index2);
		//ta.setText(str+"...."+path);


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

		out.println("GET "+path+" HTTP/1.1");
		out.println("Accept: */*");
		out.println("Accept-Language: zh-cn");
		out.println("Host: 192.168.1.254: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){
			ta.append(line+"\r\n");
		}
		s.close();
	}

	public static void main(String[] args) {
		new MyIEByGUI();
	}
}

 

域名解析

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值