基于Java--Socket-网络编程.doc_第1页
基于Java--Socket-网络编程.doc_第2页
基于Java--Socket-网络编程.doc_第3页
基于Java--Socket-网络编程.doc_第4页
基于Java--Socket-网络编程.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Java Socket 网络编程的山寨QQ(学习韩顺平老师的视频整理出的笔记)内容含盖:1. Java 面向对象编程2. 界面编程3. 网络编程4. 多线程5. 文件I/O操作6. 数据库操作1、 网络基础TCP/IP协议Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。2、 端口端口详解在开始讲什么是端口之前,我们先来聊一聊什么是 port 呢?常常在网络上听说我的主机开了多少的 port ,会不会被入侵呀!?或者是说开那个 port 会比较安全?又,我的服务应该对应什么 port 呀?呵呵!很神奇吧!怎么一部主机上面有这么多的奇怪的 port 呢?这个 port 有什么作用呢?由于每种网络的服务功能都不相同,因此有必要将不同的封包送给不同的服务来处理,所以啰,当你的主机同时开启了FTP与 WWW 服务的时候,那么别人送来的资料封包,就会依照 TCP 上面的 port 号码来给 FTP 这个服务或者是 WWW 这个服务来处理,当然就不会搞乱啰!(注:嘿嘿!有些很少接触到网络的朋友,常常会问说:咦!为什么你的计算机同时有 FTP、WWW、E-Mail 这么多服务,但是人家传资料过来,你的计算机怎么知道如何判断?计算机真的都不会误判吗?!现在知道为什么了吗?!对啦!就是因为 port 不同嘛!你可以这样想啦,有一天,你要去银行存钱,那个银行就可以想成是主机,然后,银行当然不可能只有一种业务,里头就有相当多的窗口,那么你一进大门的时候,在门口的服务人员就会问你说:嗨!你好呀!你要做些什么事?你跟他说:我要存钱呀!,服务员接着就会告诉你:喝!那么请前往三号窗口!那边的人员会帮您服务!这个时候你总该不会往其它的窗口跑吧?! 这些窗口就可以想成是port 啰!所以啦!每一种服务都有特定的 port 在监听!您无须担心计算机会误判的问题呦! ) 每一个 TCP 连接都必须由一端(通常为 client )发起请求,这个 port 通常是随机选择大于 1024 以上(因为0-1023有特殊作用,被预定,如FTP、HTTP、SMTP等)的 port 号来进行!其 TCP 封包会将(且只将) SYN 旗标设定起来!这是整个联机的第一个封包; 如果另一端(通常为 Server ) 接受这个请求的话(当然啰,特殊的服务需要以特殊的 port 来进行,例如 FTP 的 port 21 ),则会向请求端送回整个联机的第二个封包!其上除了 SYN 旗标之外同时还将 ACK 旗标也设定起来,并同时在本机端建立资源以待联机之需; 然后,请求端获得服务端第一个响应封包之后,必须再响应对方一个确认封包,此时封包只带 ACK 旗标(事实上,后继联机中的所有封包都必须带有 ACK 旗标); 只有当服务端收到请求端的确认( ACK )封包(也就是整个联机的第三个封包)之后,两端的联机才能正式建立。这就是所谓的 TCP 联机的三次握手( Three-Way Handshake )的原理。经过三向交握之后,呵呵!你的 client 端的 port 通常是高于 1024 的随机取得的 port,至于主机端则视当时的服务是开启哪一个 port 而定,例如 WWW 选择 80 而 FTP 则以 21 为正常的联机信道!总而言之,我们这里所说的端口,不是计算机硬件的I/O端口,而是软件形式上的概念。根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了哪些服务。我们都知道,提供服务就一定有服务软件的漏洞,根据这些,攻击者可以达到对目标计算机的初步了解。如果计算机的端口打开太多,而管理者不知道,那么,有两种情况:一种是提供了服务而管理者没有注意,比如安装IIS的时候,软件就会自动增加很多服务,而管理员可能没有注意到;一种是服务器被攻击者安装木马,通过特殊的端口进行通信。这两种情况都是很危险的,说到底,就是管理员不了解服务器提供的服务,减小了系统安全系数。(扯远了)端口分类端口一共有65535个 0号是保留端口1-1024 是固定端口,又叫又名端口 即被某些程序固定使用,一般程序员不使用1025-65535 是动态端口 这些端口是程序员可以使用的单工、半双工和全双工1.单工通信(Simplex Communication)即数据传输只能在一个方向上进行,比如甲可以向乙发送信息,但乙不能向甲发送信息2. 半双工(Half Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。例如,步话机是半双工设备,因为在一个时刻只能有一方说话。 3. 全双工(Full Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。例如,电话是全双工设备,因为双方可同时说话。Java socket 通信示意图 Server Client 服务端 客户端 accept()阻塞等待客户连接,有链接向下执行,没有链接就停在这里ServerSocket()监听Close()关闭连接,结束会话readLine()读取服务端信息Println()向服务器发送信息Close()关闭连接,结束会话Println()向客户端发送信息readLine()读取客户端信息Soclet()发送连接请求单工通信 只能向服务端发送信息/*SimplexServeraccept message from client*/import java.io.*;import .*;public class MyServer private ServerSocket ss; private Socket socket; private BufferedReader in; / private PrintWriter out; public static void main(String args) new MyServer(); public MyServer() tryss=new ServerSocket(10000);System.out.println(Listen 10000.);socket=ss.accept();in=new BufferedReader( new InputStreamReader(socket.getInputStream();String massage=in.readLine();System.out.println(Client+massage);catch(Exception e) System.out.println(e);finally try if(in!=null) in.close(); if(socket!=null) socket.close(); if(ss!=null) ss.close(); catch(Exception e) System.out.println(e); /*SimplexClientsend message to Server*/import java.io.*;import .*;public class MyClient private Socket socket; private BufferedReader in; private PrintWriter out; public static void main(String args) new MyClient(); public MyClient() try socket=new Socket(,10000);/ your computer IP in=new BufferedReader(new InputStreamReader(System.in);String massage=in.readLine();out=new PrintWriter(socket.getOutputStream(),true);out.println(massage);catch(Exception e) System.out.println(e);finally try socket.close();catch(Exception e1) System.out.println(e1); 因为是用手工输入测试 中文注释会报错,所以没有用中文,server中的接收数据处理部分一般用循环,为了方便测试,因此此没有用测试 开两个窗口 一个客户端 一个服务端 先打开服务端半双工/*half DuplexServeraccept message from clientsend massage to client*/import java.io.*;import .*;public class MyServer1 private ServerSocket ss; private Socket socket; private BufferedReader in,in1; private PrintWriter out; public static void main(String args) new MyServer1(); public MyServer1() try ss=new ServerSocket(10000); System.out.println(listening 10000); socket=ss.accept(); System.out.println(link 10000); /acceptMessage in=new BufferedReader(new InputStreamReader(socket.getInputStream(); String acceptMessage=in.readLine(); System.out.println(Client +acceptMessage); out=new PrintWriter(socket.getOutputStream(),true); /sendMessage in1=new BufferedReader(new InputStreamReader(System.in); String sendMessage=in1.readLine(); out.println(sendMessage); catch(Exception e) System.out.println(e); finally try if(in1!=null) in1.close(); if(in!=null) in.close(); if(socket!=null) socket.close(); if(ss!=null) ss.close(); catch(Exception e) System.out.println(e); /*half DuplexServeraccept message from serversend massage to server*/import java.io.*;import .*;public class MyClient1 private Socket socket; private BufferedReader in,in1; private PrintWriter out; public static void main(String args) new MyClient1(); public MyClient1() try socket=new Socket(,10000);/ your computer IP /sendMessage in1=new BufferedReader(new InputStreamReader(System.in); out=new PrintWriter(socket.getOutputStream(),true); String sendMessage=in1.readLine(); out.println(sendMessage); /acceptMessage in=new BufferedReader(new InputStreamReader(socket.getInputStream(); String acceptMessage=in.readLine(); System.out.println(Server +acceptMessage); catch(Exception e) System.out.println(e);finally try if(in1!=null) in1.close(); if(in!=null) in.close(); if(socket!=null) socket.close(); catch(Exception e) System.out.println(e); 客户端向服务器发完信息,只能等待服务端发送,全双工/*DuplexServeraccept message from clientsend massage to client*/import java.io.*;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MyServer3 extends JFrame implements ActionListener JTextArea jta; JTextField jtf; JButton jb; JPanel jpl; JScrollPane jsp; BufferedReader in; PrintWriter out; public static void main(String args) new MyServer3(); public MyServer3() jta=new JTextArea(); jtf=new JTextField(); jb=new JButton(send); jb.addActionListener(this); jpl=new JPanel(new BorderLayout(); jpl.add(jtf,Center); jpl.add(jb,East); jsp=new JScrollPane(jta); this.add(jsp,Center); this.add(jpl,South); this.setTitle(Server); this.setSize(350,250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try ServerSocket ss=new ServerSocket(10000); Socket socket=ss.accept(); in=new BufferedReader(new InputStreamReader(socket.getInputStream(); out=new PrintWriter(socket.getOutputStream(),true); while(true) String message=in.readLine()+n; jta.append(Client: +message); catch(Exception e) System.out.println(e); finally try if(out!=null)out.close(); if(in!=null)in.close(); catch(Exception e) System.out.println(e); public void actionPerformed(ActionEvent e) if(e.getSource()=jb) String message=jtf.getText(); jta.append(Server: +message+n); out.println(message); jtf.setText(); /*DuplexServeraccept message from serversend massage to server*/import java.io.*;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MyClient3 extends JFrame implements ActionListener JTextArea jta; JTextField jtf; JButton jb; JPanel jpl; JScrollPane jsp; BufferedReader in; PrintWriter out; public static void main(String args) new MyClient3(); public MyClient3() jta=new JTextArea(); jtf=new JTextField(); jb=new JButton

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论