JavaSE复习_12 Socket网络编程

△客户端使用Scanner与BufferedReader的异同,Scanner在客户端调用s.shutdownoutput的时候,将会因为读不到行而报异常,但是BufferedReader的readline方法则会正常终止.因此应当根据实际情况选择客户端服务端的流输入.

△实例:根据DatagramSocket和DatagramPacket建立发送端和接收端。

接收端:

public class Receive {

        public static void main(String[] args) throws IOException {
              System. out.println("接收端启动……" );
//            建立socket流
              DatagramSocket ds=new DatagramSocket(9999);
               //将要接受的数据封装到数据包中
               byte[] b =new byte[1024];
              DatagramPacket dp= new DatagramPacket(b ,b .length );
               //接受数据
               ds.receive( dp);
               //获取数据中 的信息
              String s= new String(dp .getData(),0,dp.getLength());
              System. out.println(dp .getAddress().getHostAddress()+"::"+ dp.getPort()+ "..."+s );
       }

}

发送端:

public class Send {

        public static void main(String[] args) throws IOException {
              System. out.println("发送端启动。。。。。。。。。。" );
              String s= "hello world!" ;
               byte[] b =s .getBytes();
               //建立socket连接
              DatagramSocket ds= new DatagramSocket();
               //将要发送的数据信息封装到数据包中
              DatagramPacket dp= new DatagramPacket(b,b .length ,InetAddress.getByName ("192.168.0.103" ),9999);
               //将数据包的数据发送出去
               ds.send( dp);
               //关闭socket
               ds.close();
       }

}

△TCP客户端和服务端练习时,要注意以下两点:

 1.输出流需要及时刷新,保证这一点可以让PrintWriter参数列表里有true。

 2.readline方法必须要读取到换行符,否则会一直处于阻塞状态

3.在文件读写时,当服务端读写客户端的输入流时,可以在客户端用shutdownoutput方法告诉服务端,(半关闭状态)客户端的读写已经结束。

△TCP传输也可以使用带资源的try语句(方便自动关闭):

public class Server1 {
     public static void main(String[] args) throws IOException {
         ServerSocket ss =new ServerSocket(9998);
          try (Socket s =ss .accept();) {

         PrintWriter pw= new PrintWriter(s .getOutputStream(), true);
//       Scanner scanner=new Scanner(s.getInputStream());
          try (BufferedReader bufr = new BufferedReader(new InputStreamReader(s .getInputStream()));) {
         String str= null ;
          while ((str =bufr .readLine())!= null) {
              pw.println( str.toUpperCase());
         }
         }
         }
    }
}

△TCP服务端是多线程的:在接受到一个Socket后,在run方法内执行操作(开启一条线程操作,主线程继续等待接受)标准代码如下:

public class Server2 {
     public static void main(String[] args) throws IOException {
         ServerSocket ss =new ServerSocket(9999);
          while (true ) {
         Socket s= ss.accept();
         Runnable r=new RunnableImplements(s);
         Thread t=new Thread(r);
         t.start();
         }
    }
}
class RunnableImplements implements Runnable {
     private Socket incoming;
     public RunnableImplements(Socket i) {
          incoming=i;
     }
     public void run() {
          System.out.println("任务开始");
           //任务
     }
}

△可中断套接字:

当通过套接字读写数据的时候,当前线程会被阻塞直到操作或产生超时为止.为了中断套接字操作,可以使用SocketChannel类.如下:

SocketChannel channel=SocketChannel.open(new InetSocketAddress(host,port));        //获取通道
Scanner in=new Scanner(channel);            //获取输入流,或者Channel.newInputStream()方法获取字节输入流
OutputStream out=Channels.newOutputStream(channel);     //获取输出流

这时候,如果服务器线程正在执行打开或者读取或写入操作,此时如果线程中断,那么这些操作将不会陷入阻塞,而是已抛出异常的形式结束.

△URL类可以封装统一资源定位符,URL类可以打开一个到资源的流,可以调用openConnection方法,建立连接,调用getHeadFields方法获取Map对象类型的相应头.下面是示例(将输出响应头):

public class Demo1 {
     public static void main(String[] args) throws IOException {
         URL url= new URL("http://www.baidu.com" );
         URLConnection con= url.openConnection();
          con.connect();
         Map<String,List<String>> headers =con .getHeaderFields();
          for (Map.Entry<String,List<String>> entry :headers .entrySet()) {
             String key= entry.getKey();
              for (String value :entry .getValue()) {
                 System. out .println(key +"::" +value );
             }
         }
    }
}

△URL和URLConnection实现提交表单数据:

1.URL封装资源定位符

2.打开连接,采用openConncetion方法.

3.connection.setDoOutput(true);建立可以输出的连接

4.PrintWriter out=new PrintWriter(connection.getOutPutStream()); 获取可以输出数据的流

5.调用Out的打印方法,发送数据.

时间: 2024-10-23 02:52:31

JavaSE复习_12 Socket网络编程的相关文章

socket 网络编程快速入门(一)教你编写基于UDP/TCP的服务(客户端)通信

因为UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,因为这些函数的结构往往比较复杂,参数大部分都是结构体,令人难以记忆和理解. 但是一旦我们知道这些函数包括其参数的具体含义,socket网络编程也就变得不是那么复杂.这里不赘述 具体函数的详细含义,网络上有很多的文章,同时笔者建议大家参考 MSDN,对返回值,参数等会有更好的理解. 以下均为单线程的简单实例,多线程的请关注下一篇文章. (

Socket网络编程--网络爬虫(1)

我们这个系列准备讲一下--网络爬虫.网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果.网络爬虫的基本工作原理: (1)从一个初始URL集合中挑选一个URL,下载该URL对应的页面: (2)解析该页面,从该页面中抽取出其包含的URL集合,接下来将抽取的URL集合再添加到初始URL集合中: (3)重复前两个过程,直到爬虫达到某种停止

windows下的socket网络编程(入门级)

windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先写了个简单的winSocket网路通信的例子,以便以后用到的时候有个参考. windows下使用winsock编程与linux/unix的区别在于windows下需要先有一个初始化的操作,结束的时候需要一个清理的操作.还有windows下编译的时候需要连接ws32_lib库. 大致过程如下 1.初始

Linux Socket 网络编程

Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后,过段时间不看,重新拾起这些知识的时候又要从头开始,所以,在这里做个笔记也算是做个模板,以后可以直接从某一个阶段开始接着玩... 1. socket套接字介绍 socket机制其实就是包括socket, bind, listen, connect, accept等函数的方法,其通过指定的函数实现不同

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

Socket网络编程 详细过程(转)

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().co

Socket网络编程初探

MarkdownPad Document Socket网络编程初探 客户端/服务器架构 即C/S架构,其实web服务在某种意义上也算是C/S架构 一个特点是服务器端持续运行对外提供服务 为何学习socket一定要先学习互联网协议: C/S架构的软件是基于网络进行通信的 网络的核心就是一堆协议,即标准,想要开发一款基于网络通信的软件就必须遵循这些标准 socket是处在应用层和传输层中间的一组接口 说到这,那么socket到底是个什么呢?Socket是应用层与TCP/IP协议族通信的中间软件抽象层

Python之路【第九篇】:Python基础(25)——socket网络编程

socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用打开.读写.关闭模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定

socket编程之三:socket网络编程中的常用函数

这节本来打算先给出常用函数介绍,再给两个代码实例,写着写着发现越来越长,决定把代码放在下一节. 本节内容持续更新...... 1 socket()函数 原型: int socket(int domain, int type, int protocol); 描述: 类似打开一个文件,返回一个socket描述符,唯一标识一个socket,后面相应的操作都是这用这个socket描述符. 参数: domain:协议族,常用的协议族有AF_INET.AF_INET6.AF_LOCAL.AF_ROUTE等: