1通过URL对象的openStream()方法能够得到指定资源的输入流。

通过URL读取网页内容
    1通过URL对象的openStream()方法能够得到指定资源的输入流。
    2通过输入流能够读取、訪问网络上的数据。

    案例:

   import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class UrlTest {
       public static void main(String[] args) {
		try {
			URL url = new URL("http://www.baidu.com");
		    InputStream is = url.openStream();
		    InputStreamReader isr = new InputStreamReader(is,"utf-8");
		    BufferedReader br = new BufferedReader(isr);
		    String data = br.readLine();
		    while(data != null){
		    	System.out.println(data);
		    	data = br.readLine();
		    }
		    br.close();
		    isr.close();
		    is.close();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

Socket通信实现步骤
   1 创建ServerSocekt和Socket
   2 打开连接到Socket的输入/输出流
   3 依照协议对Socket进行读写操作
   4关闭输入输出流、关闭Socket


   基于TCP的Socket通信
   client能够对应,
    服务端:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
       public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			System.out.println("server端即将启动!!");
			Socket socket = serverSocket.accept();
			InputStream is = socket.getInputStream();
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);
			String info = null;
			while((info = br.readLine()) != null){
				System.out.println("我是server,client说:" + info);
			}
			socket.shutdownInput();
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			pw.write("欢迎您!!");
			pw.flush();
			
			pw.close();
			os.close();
			br.close();
			isr.close();
			is.close();
			socket.close();
			serverSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
client:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
        public static void main(String[] args) {
			try {
				Socket socket = new Socket("localhost",8888);
				OutputStream os = socket.getOutputStream();
				PrintWriter pw = new PrintWriter(os);
				pw.write("username:admin;password:123");
				pw.flush();
				socket.shutdownOutput();
				
				InputStream is = socket.getInputStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(is));
				String info = null;
				while((info = br.readLine()) != null){
					System.out.println("我是client。server说:" + info);
				}
				
				br.close();
				is.close();
				pw.close();
				os.close();
				socket.close();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
}

多线程server与多client通信:
   基本实现步骤:
        1 server端创建ServerSocket,循环调用accept()等待client连接
2 client创建一个socket并请求和服务端连接
3 服务端接受client请求,创建socket与客户建立专线连接
4 建立连接的两个socket在一个单独的线程对话
5 server端继续等待新的连接
案例:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;


public class ServerThread extends Thread{
	Socket socket = null;
	public ServerThread(Socket socket){
		this.socket = socket;
	}
	public void run(){
		
		InputStream is= null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		OutputStream os = null;
		PrintWriter pw = null;
		try {
			is = socket.getInputStream();
			isr = new InputStreamReader(is);
			br = new BufferedReader(isr);
			String info = null;
			while((info = br.readLine()) != null){
				System.out.println("我是server。client说:" + info);
			}
			socket.shutdownInput();
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			pw.write("欢迎您!

。"); pw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(pw!= null) pw.close(); if(os != null) os.close(); if(br != null) br.close(); if(isr != null) isr.close(); if(is != null) is.close(); if(socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } // serverSocket.close(); } }


服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
       public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			Socket socket = null;
			int count = 0;
			System.out.println("server端即将启动!!

"); while(true){ socket = serverSocket.accept(); ServerThread serverThread = new ServerThread(socket); serverThread.start(); count++; System.out.println("client连接数量:" + count); InetAddress address = socket.getInetAddress(); System.out.println("当前client的IP:" + address); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }


client同上。

UDP
     DatagramPacket:表示数据报包
     DatagramSocket:进行端到端通信的类
基于UDP的Socket编程
   服务端:

 package com.hpu.lianxi;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
      public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(8800);
		byte[] data = new byte[1024];
		System.out.println("server已经启动,等待client发送数据****");
		DatagramPacket packet = new DatagramPacket(data,data.length);
	    socket.receive(packet);
	    String info = new String(data,0,packet.getLength());
	    System.out.println("这是服务端,client说:" + info);
	    
	    InetAddress address = packet.getAddress();
	    int port = packet.getPort();
	    byte[] data2 = "欢迎您!

。".getBytes(); DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port); socket.send(packet2); socket.close(); } }

client:

 package com.hpu.lianxi;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient {
         public static void main(String[] args) throws IOException {
			InetAddress address = InetAddress.getByName("localhost");
			int port = 8800;
			byte[] data = "username:admin;password:123".getBytes();
			DatagramPacket packet = new DatagramPacket(data, data.length,address,port);
			DatagramSocket socket = new DatagramSocket();
			socket.send(packet);
			
			byte[] data2 = new byte[1024];
			DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);
			socket.receive(packet2);
			String reply = new String(data2,0,packet2.getLength());
			System.out.println("我是client,server说:" + reply);
			socket.close();
		}
}

 多线程的优先级
    假设不设置优先级可能会导致执行时速度很慢,可减少优先级
    输入流与输出流的关闭
    对于同一个socket,假设关闭了输出流。则与该输出流关联的socket也会被关闭,所以一般不用
    关闭流,直接关闭socket就可以


版权声明:本文为博主原创文章,未经博主同意不得转载。
  • 本文已收录于下面专栏:
  • java
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通信Socket
举报原因:
原因补充:

(最多仅仅同意输入30个字)

<script language="javascript" type="text/javascript"> var isComment=0; //显示隐藏地址 $(function () { console.log("version:phoenix"); if(isComment){ $("#report_description").attr("disabled",true); $("#sp_n").hide(); $("#sp_reason").html("评论内容:"); } $(".report_type").click(function () { $("#panel_originalurl,#report_other_content").hide(); switch ($(this).val()) { case '3': $("#panel_originalurl").show(); $("#originalurl").focus(); break; case '7': if(isComment){ $("#report_other_content").show().focus(); } break; } }); $("#frmReport").submit(function () { if (!currentUserName) { if (confirm("您的操作必须登录。是否登录?")) { location.href = "http://passport.csdn.net/account/login?from=" + encodeURIComponent(location.href); return false; } return false; } var reportType = $("input[name=report_type]:checked").val(); if(!reportType){ alert("请选择举报原因!"); return false; } var otherInfo = ""; switch (reportType) { case '3': otherInfo = $("#originalurl").val(); if (otherInfo == ""||otherInfo=="http://") { alert("举报抄袭必须提供原创文章地址!"); $("#originalurl").focus(); return false; } else if(!checkeURL(otherInfo)) { alert("请输入正确的原创文章地址!"); $("#originalurl").focus(); return false; } break; case '7': otherInfo = $("#report_other_content").val(); if (isComment && !otherInfo) { alert("请填写举报的详细原因!"); $("#report_other_content").focus(); return false; } if(!isComment){ if(!$("#report_description").val()){ alert("请填写举报的详细原因!

"); $("#report_description").focus(); return false; } } break; } if(!isComment){ if($("#report_description").val().length>30){ alert("举报原因最多仅仅同意输入30个字!"); return false; } } nowTime = { year: new Date().getFullYear(), month: parseInt(new Date().getMonth())+1, day: new Date().getDate(), hours: parseInt(new Date().getHours())+1, minutes: parseInt(new Date().getMinutes())+1, seconds: parseInt(new Date().getSeconds())+1 }; var data = { articleId: fileName, commentId: 0, reportType: reportType, originalurl: $("#originalurl").val(), report_other_content: $("#report_other_content").val(), report_description: $("#report_description").val(), currentUserName: currentUserName, updatetime: nowTime.year+'/'+nowTime.month+'/'+nowTime.day+' '+ nowTime.hours+':'+nowTime.minutes+':'+seconds, blogUser: username }; if(!isComment){//假设是举报文章 data.report_other_content = data.report_description; // data.report_description = "1. 神经网络这是一个常见的神经网络的图:这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层"; } $.post(blog_address + "/common/report?id="+fileName+"&t=2", data, function (data) { if (data.result == 1){ SetError("感谢您的举报。我们会尽快审核!

"); }else{ if (data.content) alert(data.content); } }); return false; }); $("#btnCloseReportDialog").click(function () { CloseDiv(); }); }); //提示后关闭方法 function SetError(error) { $("#btnCloseReportDialog").trigger("click"); alert(error); CloseDiv(); } //关闭方法 function CloseDiv() { $.removeMask(); $("#report_dialog").hide(); return false; } //验证url function checkeURL(url){ return /^http(s)?:\/\/([\w-]+\.)+[\w-]+/i.test(url); } </script>

<script src="http://c.csdnimg.cn/public/common/libs/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script type="text/javascript" src="http://csdnimg.cn/release/phoenix/bower-libs/MathJax/MathJax.js?config=TeX-AMS_HTML"></script> <script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script> <script type="text/javascript" > if($(".article_collect li").length==1){$(".article_collect").hide();} if($(".article_tags li").length==1){$(".article_tags").hide();} $(".edit a").attr("href","http://mp.blog.csdn.net/postedit/"+fileName); $.each($(".edu_li a"),function(){$(this).attr("href",$(this).attr("href").replace("blog7","blog9"))}); new CNick('#uid').showNickname(); if($("#fan").html()=="") { $("#fan").html(0); } </script> <script src="http://c.csdnimg.cn/public/common/append_mark/appendMark.min.js?v=5.00.43" type="text/javascript"></script> <script type="text/javascript"> appendMark($('.recommend_list').children('a').find('dt'),$('.extension_other')) </script>
---

相关课程

本文涉及的技术,这些课程讲得更深入:

  1. 趣谈网络协议
    ‍ 刘超 | 轻松掌握网络协议核心原理
  2. Android开发高手课
    ‍ 张绍文 | 突破Android开发进阶瓶颈
posted @ 2018-01-11 14:41  yjbjingcha  阅读(18500)  评论(0)    收藏  举报