1. Qt网络编程 服务器异常断开,不能检查到网络状态变化
自己做心跳保活。因为异常断开不属于qt的处理范围,而tcp协议栈又不存在自动处理异常断线的功能,tcp连接在不正常关闭情况下通常都会被协议栈保持存活一段时间(具体和操作系统协议栈实现和设置有关)。qt无法获得tcp协议栈的状态消息,也就不会做出任何反应。所谓心跳机制请参照以下网址内容:
http://ke..com/view/4372209.htm
2. 关于TCP套接字网络编程过程中的一个问题,求指点
把if (!strcmp("tiuq",recvline))改成 if (strstr("tiuq", recvline))试试看,可能是你在终端里面敲的回车符\r也被吸收进去了,然后反转之后变成"\rtiuq",所以strcmp比较不对,换成strstr
3. TCP/IP协议与网络编程
先搞清楚 ISO/OSI与TCP/IP的关系
1.2 TCP/IP的分层体系结构与协议栈的概念
问题1:什么叫协议栈(Protocol Stack)?
如上图所示,网络协议是分层的,在这种层次结构中各层有明确的分工,不同层的协议从上到下形成了一个栈结构的依赖关系,通常将其形象地称为协议栈.问题2:为什么协议栈简称TCP/IP?
如上图所示,从该结构中可以看出,在TCP/IP的协议栈中包括很多协议(如FTP,IGMP等),但TCP和IP是该协议栈中两个最重要的协议,所以人们常常将该协议栈简称TCP/IP问题3:为什么协议栈中TCP与IP是最重要的协议?
先理解一下这4层的基本概念
------>第1层:网络接口层
功能1:发包与收包
(1)发包。它是协议栈的最底层,负责将其之上的网络层要发送出去的数据(即IP数据报)发送到其下面的物理网络
(2)收包。接收由物理网络发送到该目标机的数据帧,并抽出IP数据报交给网络层。要注意,这里所说的物理网络是指各种实际传输数据的局域网或广域网等。功能2:为什么在TCP/IP协议栈中没有定义网络接口层呢?
(1)便于实现不同网络之间的互联。
实现不同网络的互联是TCP/IP要解决的最主要问题。不同的网络尽管其数据传输介质,数据传输速率等有很大的差异,但都可以实现网络内数据的传输,当然也就可以进行TCP/IP协议栈中网络层IP数据报的传输。这样TCP/IP就可以将重点放在网络之间的互联上,而不用去纠缠各种物理网络的具体实现细节,这样就非常巧妙地解决了不同类型物理网络的互联问题。这也是TCP/IP得以广泛应用的一个重要原因
(2)为将来物理网络的发展留下了广阔的空间------>第2层:网际层(也称互联网络层)
功能:把源主机上的分组(在网际层传输的数据单位叫IP数据报,也称为IP分组)根据需要发送到互联网中的任何一台目标主机上.(关于怎样得到目标主机的IP地址,详见第3章中的ARP)什么叫路由选择?
在一个由很多网络组成的互联网中,一台主机(即源主机)与不在同一个网络中的另一台主机(目标主机)通信时,可能有多条通路相连,网际层的一个重要功能就是要在这些通路中做出选择,这就是所谓的路由选择功能.它是网际层一个非常重要的功能------>第3层:传输层
------>第4层:应用层结论:
为什么IP层非常重要?
IP层重点面向同外界打交道,比如你在广州,我在北京,IP层就能通过路由选择一条道路,以及到站后,就开始用ARP广播,你们谁是这个MAC地址的主人,听到了请回复,这时对方的IP层收包了,与自己MAC地址(全球唯一地址)一样,就开始解包(当然上层要有相应处理软件程序)
为什么TCP层非常重要?
TCP层重点面向同内部打交道,我的任务是要检查你发到我电脑里面的这个数据是不是正确的。
在IP层提供的是一种"尽力而为"的数据报传输服务,它不能保证数据总是可靠地从源主机传输到目标主机,为什么TCP能保证数据传输正确,因为它每发送一个数据都会要效验的(详见第4章传输层)
1.3 TCP/IP中数据的封装与解封过程
1.4 Internet的管理机构
例如,CNNIC(China Internet Network Information Center),中国互联网络信息中心
1.5 RFC文档
RFC(Request for Comments),至今已经发表了数千篇文章,几乎包含了与计算机通信有关的任何内容,全面地反映了Internet的研究和发展过程.==========================================
第2章 网络接口层
所讲都是硬件方面,什么是网卡,网卡是怎么做出来的,非硬件人员,跳过
==========================================
第3章 互联网络层
3.1.1 网络互联概述
internet(注意小写)---如果利用网络互联设备将两个或多个物理网络相互连接,就形成了互联网络(internetwork)
Internet(注意大写)---特指全球范围内的互联网
Router---------------将多个物理网络互联的最常用设备是路由器
Intranet----------如果一个企业内部网络,使用了Internet中的TCP/IP及其网络互联技术,但不能上网,是一个有限的,封闭的网络
Extranet----------如果一个Intranet通过防火墙等技术与外部Internet相连,则该Intranet就是一个开放的,通过外部可以访问的网络3.1.2 路由器
(1)路由器的工作原理
if(在同一IP子网) 直接发送到网络上,对方就能收到
else(不在同一IP子网) 发送一个能到达子网的路由,不知道如何传送的IP报文送给"默认网关",一级级地传送,IP报文最终送到目的地,达不到目的地的IP报文则被网络丢弃(2)路由器的功能(具有转发报文和路由选择两大功能)3.2 IP数据报格式(分报头区和数据区两大部分)
大多是理论知识,要摘抄就全摘抄了.书上介绍的才几页,也不太全,具体参考网上,此处不摘抄了,介绍几种常用网络的MTU值
注意:此节是原始套接字模块,重点.网上有教材专门讲解其模块.可以参考
---------------------------->以下是总结:第1点:集中在一个点上攻,思路全围绕它转,天网恢恢,有一个漏的,当把所有注意点集中在它上时,总会找到这个程序突破处。
以上次写代码为例:在程序内找了几天BUG,一直没果,最后一个思路我叹了口气,将思路放在操作系统上,才几分钟就从微软技术支持网站上找到了,原来此问题是要改注册表问题(此程序是多线程断点下载的实例)
第2点:微软技术支持网站是个很不错的网站,里面有很多源代码,可提供一个方向
第3点:很多代码在网上是搜索不出来的,必须要相信自己,既然认为这是对的,就一定要坚持下去,各个突破
第4点:当遇上大问题时,离开电脑一段时间(例如下班后或放假),给点独立空间思考应该怎么做!
4. Java 请教TCP网络编程里面的两个方法的使用!
package chatClient;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import org.apache.log4j.Logger;
import DownLoad.*;
import config.*;
public class ChatClient extends JFrame {
private static Logger log=Logger.getLogger(ChatClient.class);
Socket s = null;
TextField tf = new TextField();
TextArea ta = new TextArea(null,11,50,TextArea.SCROLLBARS_VERTICAL_ONLY);
Panel p=new Panel(new GridLayout(2,6,2,3));
Label l3=new Label("下裁的文件名:");
TextField tf1 = new TextField();
Button b3=new Button("下载");
Label l4=new Label("上传的文件名:");
TextField tf2 = new TextField();
Button b4=new Button("上传");
Label l1=new Label("用户名:");
Label l2=new Label("密码:");
TextField name = new TextField();
JPasswordField pwd=new JPasswordField();
Button b1=new Button("连接");
Button b2=new Button("断开");
SimpleDateFormat st=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DataOutputStream dos = null;
DataInputStream dis = null;
String cname;
boolean success=false;
boolean start=true;
public static void main(String[] args) {
new ChatClient().launchFrame();
log.debug("test");
log.info("info");
log.error("error");
}
public void launchFrame(){
setLocation(300,333);
p.add(l1);
p.add(name);
p.add(l2);
p.add(pwd);
p.add(b1);
p.add(b2);
p.add(l3);p.add(tf1);p.add(b3);p.add(l4);p.add(tf2);p.add(b4);
ta.setCaretPosition(ta.getText().length());
add(p,BorderLayout.NORTH);
add(tf,BorderLayout.SOUTH);
add(ta,BorderLayout.CENTER);
pack();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
if(!success){disconnect();}
System.exit(0);
}
});
tf.addActionListener(new TFListener());
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(check()){
connect();
if(!success){
new Thread(new Receve()).start();
}
}else{
JOptionPane.showMessageDialog(null, "用户名或密码错误,请确认后重输!");
}
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
disconnect();
}
});
b3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(tf1.getText().equals("")){
JOptionPane.showMessageDialog(null, "输入要下裁的文件名!");
}else{
new DownloadStartupC().start(tf1.getText());
}
}
});
b4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(tf2.getText().equals("")){
JOptionPane.showMessageDialog(null, "请输入要上传的文件名和路径!");
}else{
new DownloadStartup().start(tf2.getText());
}
}
});
setVisible(true);
this.setResizable(false);
}
public boolean check(){
cname=name.getText();
String pwd1=pwd.getText();
String pwd2=FileUtil.getMemberData(cname);
if(pwd1.equals(pwd2)){
return true;
}else{
return false;
}
}
public void connect(){
start=true;
try {
s= new Socket (FileUtil.getServerInfoData("serverhost"),Integer.parseInt(FileUtil.getServerInfoData("serverport")));
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
dos.writeUTF(cname+"登录 "+st.format(new Date()));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "服务器端异常,请稍后重试!");
success=true;
return;
}
success=false;
b1.setEnabled(false);
}
public void disconnect (){
try {
if(dos!=null){
dos.writeUTF(cname+"退出 "+st.format(new Date()));
dos.close();}
if(s!=null){
s.close();}
} catch (IOException e) {
e.printStackTrace();
}
success=true;
b1.setEnabled(true);
}
private class TFListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String str = tf.getText();
tf.setText("");
try {
dos.writeUTF(cname+":"+str);
dos.flush();
} catch (Exception e1) {
log.info(e.toString());
JOptionPane.showMessageDialog(null, "未连接,请连接后再发言!");
}
}
}
private class Receve implements Runnable{
public void run() {
try{
while(start){
String s= dis.readUTF();
//if(s.equals("服务器已关闭,请重新登录!")){
// start=false;
// b1.setEnabled(true);
// }
ta.setText(ta.getText()+s+'\n');
ta.setCaretPosition(ta.getText().length());
}
} catch(IOException e){
start=false;
b1.setEnabled(true);
// e.printStackTrace();
}
}
}
}
package ChatServer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import DownLoad.DownloadStartup;
import config.FileUtil;
public class ChatServer extends Frame {
ServerSocket ss = null;
Socket s = null;
boolean start = false;
DataInputStream dis = null;
List clients = new ArrayList();
TextArea ta = new TextArea(null,11,50,TextArea.SCROLLBARS_VERTICAL_ONLY);
JPanel p = new JPanel(new GridLayout(2, 2, 5, 5));
TextField tf = new TextField();
JButton b3 = new JButton("上传");
JButton b1 = new JButton("start");
JButton b2 = new JButton("stop");
class Client implements Runnable {
private Socket s = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private boolean stat = false;
public Client(Socket s) {
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
stat = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String str) {
try {
dos.writeUTF(str);
} catch (Exception e) {
clients.remove(this);
// e.printStackTrace();
}
}
public void run() {
Client c = null;
try {
while (stat) {
String str = dis.readUTF();
ta.setText(ta.getText()+str+"\n");
ta.setCaretPosition(ta.getText().length());
for (int i = 0; i < clients.size(); i++) {
c = (Client) clients.get(i);
c.send(str);
}
// System.out.println(clients.size());
}
} catch (Exception e) {
//System.out.println("closed!");
} finally {
try {
if (dos != null)
dos.close();
if (dis != null)
dis.close();
if (s != null)
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new ChatServer().launchFrame();
}
public void launchFrame() {
setLocation(300, 333);
this.setSize(300, 300);
this.setTitle("服务器端");
p.add(b1);
p.add(b2);
p.add(tf);
p.add(b3);
ta.setCaretPosition(ta.getText().length());
add(p, BorderLayout.SOUTH);
add(ta, BorderLayout.CENTER);
pack();
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Thread t=new Thread(new DisConnection());
t.start();
Client c = null;
for (int i = 0; i < clients.size(); i++) {
c = (Client) clients.get(i);
c.send("服务器已关闭,请稍后重新登录!");
}
System.exit(0);
}
});
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setTitle("服务器启动");
Thread t=new Thread(new Connection());
t.start();
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setTitle("服务器关闭");
Thread t=new Thread(new DisConnection());
t.start();
Client c = null;
for (int i = 0; i < clients.size(); i++) {
c = (Client) clients.get(i);
c.send("服务器已关闭,请稍后重新登录!");
}
}
});
b3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// System.out.println(tf.getText());
if(tf.getText().equals("")){
JOptionPane.showMessageDialog(null, "请输入要上传的文件名和路径!");
}else{
new DownloadStartup().start(tf.getText());}
}
});
setVisible(true);
}
private class Connection implements Runnable{
public void run() {
try {
ss = new ServerSocket(Integer.parseInt(FileUtil.getServerInfoData("serverport")));
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "服务器启动不成功,重试!");
}
try {
start = true;
while (start) {
s = ss.accept();
Client c = new Client(s);
// System.out.println("A Client connected!");
new Thread(c).start();
clients.add(c);
}
} catch (Exception e) {
System.out.println("服务器关闭");
} finally {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private class DisConnection implements Runnable{
public void run() {
try {
if(s!=null){
s.close();
}
if(ss!=null){
ss.close();
System.out.println("close");
}
} catch (IOException e) {
e.printStackTrace();
}
try {
FileOutputStream out=new FileOutputStream("Chathistory/history.txt");
out.write(ta.getText().getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
给你个例子 自己看吧
两个类 可以运行的 你运行起来看看
5. java网络编程中,对于客户端和服务器的tcp连接,如果客户端异常断开连接,服务器端如何获知,有什么方法
这个得用java心跳处理机制。就是客户端每隔一段时间向服务器发送指定信息,如果服务器没有收到客服端发来的信息,这时服务器和客服端连接就已经断开。具体的心跳实现网络上很多。
6. C语言Linux系统下TCP编程,connect 错误
你的client有问题,连接之前没有指定server的ip。
你只指定了端口。
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(HELLO_WORLD_SERVER_PORT);
servaddr.sin_addr.s_addr=inet_addr(serverip);//加上server的ip即可
7. TCP网络编程有什么特点
TCP编程和各基本的编程没有多大区别,主要的区别在于其中使用函数全是操作系统提供的
Tcp是一种面向连接的,可靠的字节流服务。(设有数据包编号与差错控制机制。)
特点:
由于网络的复杂性,传输信息时,数据包可能会丢失,差错控制中的确认机制在接收到数据包是发送确认信息,若是数据包丢失,则回发数据包编号,让对方重新发送;
由于网络的复杂性,传输信息时有多种网络传送途径可以选择,数据包被接收的顺序与发送顺序不同,可以根据数据包的编号,将数据包重组。
优点:网络连接是以点对点的形式,加上上述特点,保证了数据的安全性,数据包不会中途被劫。
缺点:耗费资源很多
补充:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

8. LINUX网络编程TCP服务器 客户端 有乱码怎么解决
解决办法:
1.在客户端n=read(socketfd,buff,1023);代码之前加上memset(buff,0,sizeof(buff));,这是保证收到较短数据(使用TCP你不能保证每次接收的数据和发送的数据时等长的),打印也是正确的;
2.将客户端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了;
3.将服务器端buff[n+1]+='\0';修改为buff[n]='\0';,这是因为n是下标,已经是最后一个位置了,而且和第2)一样,那个加号也要去掉,应该是笔误吧;
4.最大的问题,将服务器端write(connectfd,buff,1023);,你怎么能够保证收到1023个字符呢?也应该将while中条件移出作为WHILE中的一条语句,而且加上前面所述的memset语句,而将这里的write(connectfd,buff,1023);修改为write(connectfd,buff,strlen(buff))。
祝共同进步!
