sockettcp編程
⑴ C語言實現socket編程TCP通信的問題
我做試驗,發現是如果你這樣寫:
char sendbuf[1024] = {"123456\n"};
也就是發送數據加上了換行,服務端立即顯示了。看來不加換行就被緩存了(應該是被服務端收到但緩存了)。
⑵ TCP 和 UDP 在socket編程中的區別
UDP和TCP編程步驟也有些不同,如下:
TCP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt(); * 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、開啟監聽,用函數listen();
5、接收客戶端上來的連接,用函數accept();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
8、關閉監聽;
TCP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和埠等屬性;
5、連接伺服器,用函數connect();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
與之對應的UDP編程步驟要簡單許多,分別如下:
UDP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、循環接收數據,用函數recvfrom();
5、關閉網路連接;
UDP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置對方的IP地址和埠等屬性;
5、發送數據,用函數sendto();
6、關閉網路連接;
⑶ 在java中實現TCP協議編程中怎麼傳
在Java中實現TCP協議編程
ServerSocket:編寫TCP網路服務程序,首先要用到java.net.ServerSocket類用以創建伺服器Socket
構造方法:
ServerSocket(intport):創建綁定到特定埠的伺服器套接字
ServerSocket(intport,intbacklog):利用指定的backlog(伺服器忙時保持連接請求的等待客戶數量),創建伺服器套接字並將其綁定到指定的本地埠號。
ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的埠、偵聽backlog和要綁定到的本地IP地址創建伺服器。
Socket:客戶端要與伺服器建立連接,必須先創建一個Socket對象
常用構造方法
Socket(Stringhost,intport):創建一個流套接字並將其連接到指定主機上的指定埠號。
Socket(InetAddressaddress,intport):創建一個流套接字並將其連接到指定IP地址的指定埠號。
伺服器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收了客戶端連接請求,該方法返回一個與該客戶端建立了專線連接的Socket對象,不用程序去創建這個Socket對象。建立了連接的兩個Socket是以IO流的方式進行數據交換的,Java提供了Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。
TCP伺服器與TCP客戶端間的數據的接受圖示:
用TCP實現伺服器與客戶端的「聊天」:
實例代碼:
客戶端:
packagecom.hbsi.net;
importjava.net.Socket;
importjava.io.*;
publicclassTcpClient{
publicstaticvoidmain(String[]args)throwsException{
//1.建立tcp客戶端socket,要確定要連接的伺服器ip,port
Sockets=newSocket("192.168.49.87",9009);
//獲取鍵盤錄入
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
//2.通過建立的socket,獲取輸出流對象
//數據輸出給伺服器端
OutputStreamout=s.getOutputStream();
BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));
//獲取伺服器端返回的數據
//讀取伺服器端發過來的信息InputStreamReader()
BufferedReaderbrin=newBufferedReader(newInputStreamReader(
s.getInputStream()));
Stringline=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
Stringstr=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
伺服器端:
packagecom.hbsi.net;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTcpServer{
publicstaticvoidmain(String[]args)throwsException{
//1.建立伺服器socket
ServerSocketss=newServerSocket(9009);
//2.調用accept()
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+"...connection");
//讀取客戶的信息的輸入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));
//向客戶端發送信息輸出流,服務端向客戶端返回信息OutputStreamWriter()
BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(
s.getOutputStream())); Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());//伺服器端收到信息後,將信息轉為大寫返回給客戶端toUpperCase()
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}