Socket连接代码示例、WebService 小demo示例

最近面试遇到的问题

  • 1:开闭原则
    开放对原来代码的扩展,封闭对原来代码的修改

  • 2:http协议
    A : URL是http(超文本传输协议)是基于请求与响应模式的、无状态的、应用层协议。长基于TCP的连接方式
    B : HTTP请求,http请求分别包括(请求行、消息报头、请求正文)
    请求行:Method Request-URI HTTP-Version CRLF
    Method请求方式包括(GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS)
    C : HTTP响应,http响应分别包括(状态行、消息报头、返回正文)
    状态行:HTTP-Version Status-Code Reason-Phrase CRLF
    详细见:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

  • 3:https协议

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
    详细见:http://blog.csdn.net/yufaw/article/details/8515889

    什么是HTTPS
    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安 全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使 用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。

    HTTP和HTTPS的区别
    http协议和https有着很大的区别。总的来说,http效率更高,https安全性更高。
    https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
    http的连接很简单,是无状态的 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全


  • 4:Socket连接代码示例
    Socket编程概念有两个:1、ServerSocket(服务端);2、Socket(客户端)。服务端与客户端之间通过Socket来建立连接,并通信

1):服务端代码:

package cn.com.demo5;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server5 {
    public static void main(String args[]) throws IOException {
        // 为了简单起见,所有的异常信息都往外抛
        int port = 8899;
        // 定义一个ServerSocket监听在端口8899上
        ServerSocket server = new ServerSocket(port);
        while (true) {
            //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
            //服务器启动后,或完成一个连接后,会再次在此等候下一个连接
            Socket socket = server.accept();
            // 每接收到一个Socket就建立一个新的线程来处理它
            new Thread(new Server5Task(socket)).start();
        }
    }
}

2):创建ServerTask类:

package cn.com.demo5;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

/**
 * 用来处理Socket请求的
 */
public class Server5Task implements Runnable {
    private Socket socket;

    //构造函数
    public Server5Task(Socket socket) {
        this.socket = socket;
    }
    //实现Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
    public void run() {
        try {
            //调用与客户端实现的方法
            handleSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 跟客户端Socket进行通信
     * 
     * @throws Exception
     */
    private void handleSocket() {
        BufferedReader br = null;
        Writer writer = null;
        try {
            //接收客户端传递过来的参数,设置接收的编码格式为:GBK
            br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(), "GBK"));
            StringBuilder sb = new StringBuilder();
            String temp;
            int index;
            while ((temp = br.readLine()) != null) {
                System.out.println(temp);
                // 遇到 eof 时就结束接收
                if ((index = temp.indexOf("eof")) != -1) {
                    sb.append(temp.substring(0, index));
                    break;
                }
                sb.append(temp);
            }
            System.out.println("客户端: " + sb);
            // 服务端下发给客户端的参数,设置传递参数的编码格式为:UTF-8
            writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");  
            writer.write("你好,客户端。");
            /**
             * BufferedReader的readLine方法是一次读一行的,这个方法是阻塞的,
             * 直到它读到了一行数据为止程序才会继续往下执行,那么readLine什么时候才会读到一行呢?
             * 直到程序遇到了换行符或者是对应流的结束符readLine方法才会认为读到了一行,才会结束其阻塞,让程序继续往下执行。
             * 所以我们在使用BufferedReader的readLine读取数据的时候一定要记得在对应的输出流里面一定要写入换行符
             * (流结束之后会自动标记为结束,readLine可以识别),写入换行符之后一定记得如果输出流不是马上关闭的情况下记得flush一下,
             * 这样数据才会真正的从缓冲区里面写入
             */
            writer.write("eof\n");
            //是当前线程休眠,单位为毫秒值。可测试客户端代码里面的超时设置
            Thread.sleep(12 * 100);
            writer.flush();//写完后要记得flush  
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
                if (br != null) {
                    br.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

3):客户端代码:

package cn.com.demo5;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.SocketTimeoutException;

public class Client5 {
    public static void main(String args[]) {
        Socket client = null;
        Writer writer = null;
        BufferedReader br = null;

        String host = "127.0.0.1"; // 要连接的服务端IP地址
        int port = 8899; // 要连接的服务端对应的监听端口
        try {
            // 与服务端建立连接
            client = new Socket(host, port);
            // 建立连接后就可以往服务端写数据了
            // 客户端发送给服务端的参数,设置传递参数的编码格式为:GBK
            writer = new OutputStreamWriter(client.getOutputStream(), "GBK");
            writer.write("你好服务端。");
            writer.write("eof\n");//BufferedReader读取,记得加换行
            writer.flush();
            // 写完以后进行读操作
            br = new BufferedReader(new InputStreamReader(
                    client.getInputStream(), "UTF-8"));
            // 设置超时间为10秒
            client.setSoTimeout(10 * 1000);
            StringBuffer sb = new StringBuffer();
            String temp;
            int index;
            try {
                while ((temp = br.readLine()) != null) {
                    if ((index = temp.indexOf("eof")) != -1) {
                        sb.append(temp.substring(0, index));
                        break;
                    }
                    sb.append(temp);
                }
            } catch (SocketTimeoutException e) {
                System.out.println("数据读取超时。");
            }
            System.out.println("服务端: " + sb);
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            try {
                if (writer != null) {
                    writer.close();
                }
                if (writer != null) {
                    br.close();
                }
                if (writer != null) {
                    client.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

详细了解:http://haohaoxuexi.iteye.com/blog/1979837

  • 4:WebService入门:

    1)、WebService工作原理-SOAP
    当客户端调用一个WebService的方法时,首先将方法名称和需要传递的参数包装成XML,也就是SOAP包,通过HTTP协议传递到服务器端,然后服务器端解析这段XML,得到被调用的方法名称和传递过来的参数,进而调用WebService相应的方法,方法执行完毕后,将返回结果再次包装为XML,也就是SOAP响应,发送到客户端,最后客户端解析这段XML,最终得到返回结果。

    2)、WebService 小demo示例:
    A:创建WebService项目,如图:
    这里写图片描述

    B:代码示例:

package cn.com.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;

/**
 * 申明 WebService 类
 * @author Summer
 *
 */
@WebService()
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Hello {

    @WebMethod(operationName="test1")
    public String sayHello(String userName) { 
        return "Hello,"+userName+"!"; 
    } 

    @WebMethod(operationName="test2")
    public String sayHello() { 
        return "Hello World!"; 
    } 

    //执行该方法报错时,在在前面加上 @SOAPBinding(style = SOAPBinding.Style.RPC)
    public static void main(String[] args) {
        //将WebService发布到指定地址  
        Endpoint.publish("http://localhost:8080/WebServiceTest/Hello", new Hello());
        System.out.println("Success");
        //浏览器输入地址:http://localhost:8080/WebServiceTest/Hello?wsdl
    }
}

C : 在浏览器中输入上述地址后,如图:
这里写图片描述

下载文件:http://dldx.csdn.net/fd.php?i=993243919716741&s=d86ec19649b90aef8ca3ab3bce8f5b69

下载完文件后,解压;进入cmd 输入:
1.打开 cmd
2.敲dos 命令: d: 回车
3.敲dos 命令: cd D:\WebServers\axis-1_4\lib 回车(具体包存放的位置)
4.敲dos 命令: java -classpath “.;commons-logging- 1.0.4.jar;axis.jar;commons-discovery-0.2.jar;jaxrpc.jar;wsdl4j-1.5.1.jar;saaj.jar;activation.jar;mail.jar” org.apache.axis.wsdl.WSDL2Java -o “abcdefg”
5.接着第4步:加上空格,再加上你的地址;如: http://localhost:8080/WebServiceTest/Hello?wsdl
6:生成的java文件会存放在:D:\WebServers\axis-1_4\lib\abcdefg 目录下。将文件拷入你的工程里面。并将里面的jar包也拷到项目lib目录下
7:创建 clientTset 类进行测试

package cn.com.client;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import cn.com.service.Hello;
import cn.com.service.HelloServiceLocator;

public class clientTest {
    public static void main(String args[]) throws ServiceException, RemoteException {    
        HelloServiceLocator service = new HelloServiceLocator();    
        Hello helloProxy = service.getHelloPort();    
        String hello1 = helloProxy.test1("世界"); 
        System.out.println(hello1); 
        String hello2 = helloProxy.test2(); 
        System.out.println(hello2);  
    } 
}

8:运行结果:Hello,世界 Hello World!(不知为何,我这边响应很慢,等了好几分钟才出现结果。)



浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值