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也不行。

 

posted @ 2017-08-27 18:03  汪神  阅读(194)  评论(0编辑  收藏  举报