通过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

最新文章

  1. yii asset 初步
  2. OpenCV2:等间隔采样和局部均值的图像缩小
  3. Freemaker 自定义函数
  4. Android下载更新的安装包以及九宫格界面
  5. 在R语言中无法设置CRAN镜像问题
  6. 【NOIP2010】【P1317】乌龟棋
  7. STM32F103定时器输出PWM波控制直流电机
  8. ☀Chrome模拟移动端浏览器
  9. 查看linux版本号的几种方法
  10. 武汉新芯:定位存储器制造,两年后或推3D NAND
  11. CodeForces 652A Gabriel and Caterpillar
  12. 容器常用操作 - 每天5分钟玩转 Docker 容器技术(25)
  13. Duilib第一步(III)-知识进阶
  14. spring schedule定时任务(二):配置文件的方式
  15. PHP Curl会话请求
  16. xml的作用
  17. BBS总结
  18. SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)。
  19. IOC框架之 Unity 入门
  20. PHP hexdec() 函数

热门文章

  1. 通过OpenGL ES在iOS平台实践增强现实(一)
  2. android hook 框架 xposed 如何实现挂钩
  3. 菜单栏选中时CSS3过渡效果
  4. 委托delegate与Dictionary实现action选择器
  5. xpath测试工具 xpath调试工具
  6. WritePrivateProfileString等读写.ini配置文件
  7. Appium+python自动化10-AVD 模拟器【转载】
  8. Appium+python自动化2-环境搭建(下)【转载】
  9. Selenium2+python自动化1-环境搭建【转载】
  10. 基于最新友盟开发文档,集成友盟分享功能,赋demo