1,什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
2,Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写 *** 作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
3,创建Socket
创建Socket
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:
Socket(InetAddress address, int port)
Socket(InetAddress address, int port, boolean stream)
Socket(String host, int prot)
Socket(String host, int prot, boolean stream)
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port)
ServerSocket(int port, int backlog)
ServerSocket(int port, int backlog, InetAddress bindAddr)
Socket client = new Socket("127.0.01.", 80)
ServerSocket server = new ServerSocket(80)
在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。
提供一个聊天功能的给你import java.net.*
import java.io.*
class My1 extends Thread
{
private Socket skt
public My1(Socket skt)
{
this.skt = skt
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()))
for()
{
if(br.readLine()==null) {break}
System.out.println(br.readLine()) // 阻塞
}
}
catch(Exception e)
{
System.out.println("对方断线!")
}
}
}
class My2 extends Thread
{
private Socket skt
public My2(Socket skt)
{
this.skt = skt
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
PrintWriter pw = new PrintWriter(skt.getOutputStream())
for()
{
pw.println("姓名====>:"+br.readLine()) // 阻塞
pw.flush()
}
}
catch(Exception e)
{
System.out.println("对方断线!")
}
}
}
public class Good
{
public static void main(String[] args) throws Exception
{
//连接的目的是:获得Socket对象
Socket skt
System.out.print("请输入<port>或者:<ip>,<port>")
// 先选择角色
String[] ss = new BufferedReader(new InputStreamReader(System.in)).readLine().split(",")
if(ss.length==1)
skt = new ServerSocket(Integer.parseInt(ss[0])).accept()
else
skt = new Socket(ss[0], Integer.parseInt(ss[1]))
System.out.println("连接到:" + skt.getInetAddress().getHostAddress())
// 连接建立,角色消失
new My1(skt).start() //读网络
new My2(skt).start() //读键盘
}
}
这是因为文件路径不对造成的,解决方法如下:
1、首先pro文件配置:Qt网络功能需要在pro文件增加网络库。
2、QTcpServer服务端建立的方法代码,如下图所示。
3、QTcpServer当有新客户端连接时,会发出QTcpServer::newConnection的信号方法代码。
4、客户端为主动连接方不需要监听,直接建立QTcpSocket代码。
5、最后通过connectToHost连接指定ip和端口,将socket的连接成功的信号与对应槽连接,当连接成功可以将自定义的标记位置为true。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)