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