您的位置:首页 > 其它

不知道做了什么,电脑好卡。。。讲讲Socket,我不太懂,却开始懂得知识

2014-05-10 23:57 267 查看
首先是,我看视频做的笔记,视频是兄弟连的java视频,不错,还是能够很生动的理解的。

/** 网络通信协议:

要使计算机连城的网络能够互通信息,需要对数据传输速率、传输代码、代码结构、传输控制步骤、出错控制等制定一组标准,这一组共同遵守的通信标准就是网络通信协议,不同的计算机之间必须使用相同的通讯协议才能进行通信

*/

/**网络通信接口:

为了使两个节点之间能进行对话,必须在他们之间建立通信工具(接口),使彼此之间能够进行信息交换,

接口包括两部分:

硬件:实现节点之间的信息传送(工具)

软件:规定双方进行通信的约定协议(代码)

*/

/** 传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。

*/

/** IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址。网络中每台计算机的一个标识号。常见的IP地址,分为IPv4与IPv6两大类。

本地IP:127.0.0.1 /localhost

端口号(port):端口号范围:0~65535之间,0~1024之间的端口是用于一些知名的网络服务和应用

*/

/** 网络编程主要是指完成C/S程序的开发,程序的开发结构有两种:

C/S:(Client/Server或客户/服务器模式):Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。[开发两套程序,两套程序同时维护,例如:QQ等,一般都比较稳定]

B/S:(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser)如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或SQL Server等数据库。浏览器通过Web Server 同数据库进行数据交互。

[开发一套程序,客户端使用浏览器进行访问,例如:论坛等,稳定性差,安全性也差]

但是C/S的程序开发在实际的java应用中毕竟很少了,而且整个java基本都是以B/S为主。

【C/S维护成本高,还需要下载客户端才行,所以开发的程序就越来越少了。】

*/

/** C/S程序主要可以完成以下两种程序的开发:

TCP(Transmission Control Protocol):传输控制协议,采用三方握手的方式,保证准确的连接操作。例如战地报[需要保密发送的]。

UDP(User Datagram Protocol):数据报协议,发送数据包,例如:手机短信或qq消息[不可靠,但是是公众的数据]

数据帧格式:| 协议类型 | 源IP | 目标IP | 源端口 | 目标端口 | 帧序号 | 帧数据 |

*/

/** tcp程序概述:

tcp是一个可靠协议,面向连接协议

实现tcp程序,需要编写服务器和客户端,javaAPI为我们提供了net包,为实现网络应用程序提供类。

ServerSocket:此类实现服务器套接字。

Socket:此类实现客户端套接字

Socket是网络驱动层提供给应用程序编程的接口和一种机制。

[就好像淘宝,卖家和卖家都只需要和快递员交流,就可以把货物从卖家发送到买家了,但是买家和卖家接触的快递员是两个不同的快递员,在这里快递员就是Socket,扮演的是中间人的作用。]

*/

/** 实现服务器端和客户端程序:

服务器端:

public class ServerSocket extends Object

实现服务器套接字,服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能向请求者返回结果。

ServerSocket(int port);

创建绑定到特定端口的服务器套接字。

void setSoTimeout(int timeout);

通过制定超市启用/禁用SO_TIMEOUT,以毫秒为单位。

InetAddress getInetAddress();

返回此服务器套接字的本地地址。

Socket accept();

侦听并接受到此套接字的连接

客户端:

public class Socket extends Object

此类实现客户端套接字,是两台机器间通信的端点。

Socket(String host,int port);

创建一个流套接字并将其连接到制定主机上的指定端口号

InputStream getInputStream();

返回此套接字的输入流

OutputStream getOutputStream();

返回此套接字的输出流

void setSoTimeout(int timeout);

启用/禁用带有指定超时值的SO_TIMEOUT,以毫秒为单位。

*/

/** ECHO程序:

ECHO为应答,程序的功能是客户端向服务器发送一个字符串,服务器不做任何处理,直接把字符串返回给客户端

Echo程序是最为基本的客户/服务器端程序。

*/

下面是我在看视频的时候,照敲的代码,不得不说这个代码还是有些问题的,所以我进行了优化,下面的代码和视频中的有些不一样,想知道我做了什么优化的,可以去下载视频看看,然后对比看有哪些不同,然后就可以学到东西了,哈哈哈~~不想看视频的,那就直接看我的代码吧~~明天再对代码进行解释:

下面是客户端的代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package EchoTest;

import java.io.*;
import java.net.*;

/**
*
* @author Janeness
*/
public class EchoServerDemo {

public static void main(String[] args) throws IOException {
//这里是创建一个服务器端的Socket
ServerSocket ss = new ServerSocket(8000);
System.out.println("服务器已经启动");
System.out.println("正在等待连接。。。");
Socket s = ss.accept();
System.out.println("已连接到:" + s.getInetAddress().getHostAddress());
//获取输入输出流
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(
new BufferedOutputStream(s.getOutputStream()));
boolean bool = true;//循环接收数据
while (bool) {
String info = br.readLine();
if (info == null || "bye".equals(info)) {
System.out.println(info);
ps.println("echo:" + info);
ps.flush();
bool = false;
} else {
System.out.println(info);
ps.println("echo:" + info);
ps.flush();
}
}
System.out.println("客户端断开连接!");
ps.close();
br.close();
}
}
接下来是客户端的代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package EchoTest;

import java.io.*;
import java.net.*;
import java.util.Scanner;

/**
*
* @author Janeness
*/
public class EchoClientDemo {

public static void main(String args[]) throws UnknownHostException, IOException {
Socket s = new Socket("localhost", 8000);
System.out.println("与服务器连接成功!");
Scanner input = new Scanner(System.in);
boolean flag = true;
PrintStream ps = new PrintStream(
new BufferedOutputStream(s.getOutputStream()));
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
while (flag) {
System.out.println("请输入:");
String info = input.next();
if ("bye".equals(info)) {
ps.println(info);
ps.flush();
flag = false;
} else {
ps.println(info);
ps.flush();
System.out.println(br.readLine());
}
}
ps.close();
br.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: