zoukankan      html  css  js  c++  java
  • Java socket1

    注意: 网络编程不是等于网站编程。  html css JavaScript那些是网站编程,是构建在网络编程的基础之上的,网络编程是它的底层。    比方说qq,联动的游戏,这些是网络编程。  

    一般的网络编程叫socket编程(英文是插座的意思)。

     在Java里面,所有关于网络编程的类都在java.net这个包里面

    server socket是用来实现通tcp连接的服务器端。

    端口号在计算机内部两个字节,用来区分不同的应用程序。,提一句,自己编写程序的时候,占端口号的时候,1024以下的不要占,,因为系统可能随时征用。    有些比较有名的端口像80端口,HTTP端口,21ftp端口……

    端口又分tcp端口和udp端口,是分开的,又都分别有六万多个端口。

    做网络应用程序要记得首先启动server再启动client,写的时候就要一起写。

    import java.net.*;
    /*server端*/
    public class TCPServer {
        public static void main(String[] args) throws Exception {
            ServerSocket ss = new ServerSocket(6666);  //监听6666端口
            System.out.println("server 启动成功!");
            Socket s = ss.accept();   //接受连接,并弄一个插口和client交流
            System.out.println("A client has connected");
        }
    }
    import java.net.*;
    /*client端*/
    public class TCPClient {
        public static void main(String[] args) throws Exception {
            Socket s = new Socket("192.168.56.1",6666);
        }            
    }

    先是server端的这句: 

    ServerSocket ss = new ServerSocket( int port) ;  

    要给它指定一个端口号。告诉它这个serversocket在哪个端口上在监听客户端的连接。一个server有很多个端口,现在已经 有一个程序在监听你给的那个端口了。注意如果没有客户端连上来,它就一直在那不动。               

     ServerSocket ss = new ServerSocket( 6666) ;

    再是client端:

    Socket(String host,int port)------这是socket的一个比较好用的构造方法。 host一般好像就指定一个ip地址,就写个本机ip         port把6666一填,这个对象一出来,客户端就申请和这个服务器端连接了,也可以说是粘连上了。

    然后再是server端:

    Socket s = new ss.accept();   //这是个接收的意思,然后你看这个s也是个插座,它的意思是,接受之后,在server这一端也建立一个插座,然后就专门跟client这个插座,然后就可以来回地通话。      如果又有一个客户端申请了,你还要accept。所以客户端的这里一般是死循环,就不断地accept。(这个accept()方法是堵塞式的,如果没有客户端连接他就一直在那等)

     但是这样写只能接受一个连接,那这个server也太差劲了。

    while(true) {
        Socket s = ss.accept();   //接受连接,并弄一个插口和client交流
        System.out.println("A client has connected");    
    }

    这样就是一直在那等客户端的连接。

    现在我们连上了对吧,我们来说句话。我们用流来说话。

    import java.net.*;
    import java.io.*;
    
    public class TCPClient {
        public static void main(String[] args) throws Exception {
            Socket s = new Socket("192.168.56.1",6666);  //发出连接的申请
            OutputStream os = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);  //直接用这个outputstream说话不方便所以给他包个包
            dos.writeUTF("Fuck you server");
            dos.flush();
            dos.close();
            s.close();
        }            
    }

    对于client端,它是往外输出。  当一个连接连接到服务器端后,相当于这个连接它有两根管道。一根输入管道一根输出管道。              DataOutputStream有个方法是readUtf(),readUtf()这个方法也是阻塞的.

    这个socket也是个连接吗,所以也要close

    但是对于server端,我们还是看不到,因为我们还没有接收。

    import java.net.*;
    import java.io.*;
    
    public class TCPServer {
        public static void main(String[] args) throws Exception {
            ServerSocket ss = new ServerSocket(6666);  //监听6666端口
            System.out.println("server 启动成功!");
            while(true) {
                Socket s = ss.accept();   //接受连接,并弄一个插口和client交流
                System.out.println("A client has connected");
                DataInputStream dis = new DataInputStream(s.getInputStream());  //这个s连着client的socket嘛,所以这里拿的input管道就是client的output                System.out.println(dis.readUTF());
                dis.close();
                s.close();
                
            }
            
        }
    }

    注意一个server在启动,监听着6666,再起个server(port也是6666)就无法正常运行了。哪怕是重新java刚刚那个server也不行。

  • 相关阅读:
    C#设计模式(8)——桥接模式(Bridge Pattern)
    我的微软最有价值专家(Microsoft MVP)之路
    C#设计模式(7)——适配器模式(Adapter Pattern)
    C#设计模式(6)——原型模式(Prototype Pattern)
    C#设计模式(5)——建造者模式(Builder Pattern)
    C#设计模式(4)——抽象工厂模式
    C#设计模式(3)——工厂方法模式
    C#设计模式(2)——简单工厂模式
    [C# 基础知识系列]C#中易混淆的知识点
    [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • 原文地址:https://www.cnblogs.com/wangshen31/p/7436661.html
Copyright © 2011-2022 走看看