㈠ 用java編寫一個socket通信程序。
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketss;
Sockets;
try{
ss=newServerSocket(8888);
s=ss.accept();
InputStreamReaderisr=newInputStreamReader(s.getInputStream());
BufferedReaderbr=newBufferedReader(isr);
System.out.println(br.readLine());
br.close();
isr.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
importjava.io.PrintWriter;
importjava.net.Socket;
publicclassClient{
publicstaticvoidmain(String[]args){
try{
Sockets=newSocket("127.0.0.1",8888);
PrintWriterpw=newPrintWriter(s.getOutputStream());
pw.write("helloserver");
pw.flush();
pw.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
㈡ java socket 的問題 伺服器和客戶端輸入沒反應,在對方的命令行窗口顯示不出來
package com.v512.TestServer;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class TestServer {
public static void main(String[] args) {
try {
ServerSocket s=new ServerSocket(8888);
Socket s1=s.accept();
OutputStream os=s1.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
InputStream is=s1.getInputStream();
DataInputStream dis=new DataInputStream(is);
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String info;
while(true){
info=dis.readUTF();
System.out.println("對方說:"+info);
if(info.equals("bye"))
break;
info=br.readLine();
dos.writeUTF(info);
if(info.equals("bye"))
break;
}
dos.close();
dis.close();
s1.close();
}
catch (SocketException e) {
System.out.println("網路連接異常,程序退出!");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
package com.v512.TestServer;
import java.net.Socket;
import java.net.SocketException;
import java.io.*;
public class TestClient {
public static void main(String[] args) {
try {
Socket s1 = new Socket("localhost",8888);
InputStream is=s1.getInputStream();
DataInputStream dis=new DataInputStream(is);
OutputStream os=s1.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String info;
while(true){
info=br.readLine();
dos.writeUTF(info);
if(info.equals("bye"))
break;
info=dis.readUTF();
System.out.println("對方說:"+info);
if(info.equals("bye"))
break;
}
dis.close();
dos.close();
s1.close();
} catch (SocketException e) {
System.out.println("網路連接異常,程序退出!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
嘗試下我改的。。。。。
㈢ 基於Socket編程實現兩台linux計算機之間傳輸文件的程序netcp,實現命令行方式同步推送。急用,謝謝
1、採用socket的tcp協議開發,採用server/client架構;
2、首先在兩台計算機上開發一個deamon程序,後台運行server,解釋遠程客戶端的命令;
3、開發客戶端程序netcp,解釋輸入參數,並從遠程伺服器獲取文件,寫入本機的目錄中。
㈣ delphi怎樣用socket發送,接受record類型的數據
網路應用分為客戶端和服務端兩部分,而Socket類是負責處理客戶端通信的Java類。通過這個類可以連接到指定IP或域名的伺服器上,並且可以和伺服器互相發送和接受數據。在本文及後面的數篇文章中將詳細討論Socket類的使用,內容包括Socket類基礎、各式各樣的連接方式、get和set方法、連接過程中的超時以及關閉網路連接等。
在本文中,我們將討論使用Socket類的基本步驟和方法。一般網路客戶端程序在連接服務程序時要進行以下三步操作。
1.連接伺服器
2.發送和接收數據
3.關閉網路連接
一、連接伺服器
在客戶端可以通過兩種方式來連接伺服器,一種是通過IP的方式來連接伺服器,而另外一種是通過域名方式來連接伺服器。
其實這兩種方式從本質上來看是一種方式。在底層客戶端都是通過IP來連接伺服器的,但這兩種方式有一定的差異,如果通過IP方式來連接服務端程序,客戶端只簡單地根據IP進行連接,如果通過域名來連接伺服器,客戶端必須通過DNS將域名解析成IP,然後再根據這個IP來進行連接。
在很多程序設計語言或開發工具中(如C/C++、Delphi)使用域名方式連接伺服器時必須自己先將域名解析成IP,然後再通過IP進行連接,而在Java中已經將域名解析功能包含在了Socket類中,因此,我們只需象使用IP一樣使用域名即可。
通過Socket類連接伺服器程序最常用的方法就是通過Socket類的構造函數將IP或域名以及埠號作為參數傳入Socket類中。Socket類的構造函數有很多重載形式,在這一節只討論其中最常用的一種形式:public Socket(String host, int port)。從這個構造函數的定義來看,只需要將IP或域名以及埠號直接傳入構造函數即可。下面的代碼是一個連接服務端程序的例子程序:
package mysocket;
import java.net.*;
public class MyConnection
{
public static void main(String[] args)
{
try
{
if (args.length > 0)
{
Socket socket = new Socket(args[0], 80);
System.out.println(args[0] + "已連接成功!");
}
else
System.out.println("請指定IP或域名!");
}
catch (Exception e)
{
System.err.println("錯誤信息:" + e.getMessage());
}
}
}
在上面的中,通過命令行參數將IP或域名傳入程序,然後通過Socket socket = new Socket(args[0], 80)連接通過命令行參數所指定的IP或域名的80埠。由於Socket類的構造函數在定義時使用了throws,因此,在調用Socket類的構造函數時,必須使用try…catch語句來捕捉錯誤,或者對main函數使用throws語句來拋出錯誤。
測試正確的IP
java mysocket.MyConnection 127.0.0.1
輸出結果:127.0.0.1已經連接成功!
測試錯誤的IP
java mysocket.MyConnection 10.10.10.10
輸出結果:錯誤信息:Connection timed out: connect
註:10.10.10.10是一個並不存在的IP,如果這個IP在你的網路中存在,請使用其它的不存在的IP。
測試正確的域名
java mysocket.MyConnection www.ptpress.com.cn
輸出結果:www.ptpress.com.cn已經連接成功!
測試錯誤的域名
java mysocket.MyConnection www.ptpress1.com.cn
輸出結果:錯誤信息:www.ptpress1.com.cn
使用Socket類連接伺服器可以判斷一台主機有哪些埠被打開。下面的代碼是一個掃描本機有哪些埠被打開的程序。
㈤ 如何在ubuntu中命令行關閉python socket伺服器
本文介紹下,在solaris 系統下,python socket server重啟後,提示埠被佔用,telnet埠失敗。這里給出一個解決方法,有需要的朋友參考下。
在solaris 系統下,socket server被重啟後,提示埠被佔用,telnet埠又是不成功的,說明服務已被關閉。
通過netstat可以看到埠還處於於fin_wait_2狀態,solaris要4分鍾才能關閉。
遇到這個問題時,可以採用如下的方法解決,以減少等待時間。
1,加上s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。
代碼:
復制代碼代碼示例:
self.host=socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((self.host,self.port))
s.listen(5)
2,修改系統fin_wait,time_wait的時間設置。這個時間改短,也利於系統系能。
修改方法
查看或設置:
使用get命令來確定當前時間間隔,並使用set命令將時間間隔指定為30秒。
例如:
復制代碼代碼示例:
ndd -get /dev/tcp tcp_time_wait_interval
ndd -set /dev/tcp tcp_time_wait_interval 30000
預設值:對於 Solaris 操作系統,預設等待時間間隔為 240000 毫秒(即 4 分鍾)。
建議值:60000 毫秒。
Solaris TCP_FIN_WAIT_2_FLUSH_INTERVAL
描述:
指定禁止處於FIN_WAIT_2狀態的連接保持該狀態的計時器時間間隔。
當連接比率較高時,這將累積大量的TCP/IP連接,從而導致伺服器性能下降。在高峰時間段,伺服器會發 生延遲。
如果伺服器延遲,netstat命令顯示對HTTP Server打開的許多套接字處於CLOSE_WAIT或FIN_WAIT_2狀態。
明顯的延遲可能會長達4分鍾,其間伺服器無法發送任何響應,但是CPU利用率保持很高,所有活動都在系統進程中。
查看和設置:
使用get命令來確定當前時間間隔,並使用set命令將時間間隔指定為67.5秒。
例如:
㈥ UDP和Socket通信步驟
這是在網上找到的,希望對你有所幫助。
sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);
WINDOWS環境下TCP/UDP編程步驟:
1. 基於TCP的socket編程是採用的流式套接字。
在這個程序中,將兩個工程添加到一個工作區。要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:將套接字設置為監聽模式等待連接請求(listen());
4:請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept());
5:用返回的套接字和客戶端進行通信(send()/recv());
6:返回,等待另一連接請求;
7:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客戶端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:向伺服器發出連接請求(connect());
3:和伺服器端進行通信(send()/recv());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
客戶端的代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("%s\n",recvBuf);
send(sockClient,"hello",strlen("hello")+1,0);
closesocket(sockClient);
WSACleanup();
}
2.基於UDP的socket編程是採用的數據報套接字。
在這個程序中,將兩個工程添加到一個工作區。同時還要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:等待和接收數據(sendto()/recvfrom());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7003);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
對於基於UDP的socket客戶端來說,要進行如下步驟:
1:創建一個套接字(socket);
2:向伺服器發送數據(sendto);
3:關閉套接字;
代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
}
LINUX環境下TCP/UDP編程步驟:
TCP編程步驟:
一. 服務端:
1.socket(int domain,int type,int protocol):建立套接字;
2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本機地址和埠跟上一步建立的socket綁定在一起;
3.listen(int sockid,int qsize):監聽某套接字;
4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;
5.recv(int fd,void *buf,size_t nbytes,int flags):從套接字接收數據;
6.close(fd) 和close(sockid)
二.客戶端:
1. socket():建立套接字;
2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):連接到伺服器;
3. send(int sockfd,const void *buf,size_t nbytes,int flags):發送數據到伺服器.
4. close(sockid);
UDP編程步驟:
一,服務端:
1. socket():同上;
2. bind():同上;
3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收數據,並且記錄下接收到的數據來源;一定要注意這里的參數addrlen,它不僅是函數的輸出,也是函數的輸入!所以要在調用該函數之前對addrlen賦值sizeof(struct sockaddr)。否則返回的地址from將會出錯!
4. close(sockfd);
二. 客戶端:
1. socket();同上;
2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址發送數據;
3. close(sockfd);
㈦ socket編程:我想將socket程序里的輸入在命令行運行時就給出數值,請問有什麼函數嗎
通過命令行將參數傳遞給程序不能使用scanf。需要為main函數添加參數
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[])//argc參數的個數,argv存放參數的數組
{
int a = 0;
int b = 0;
if(argc == 3)
{
a = atoi(argv[1]);
b = atoi(argv[2]);
}
printf("\na+b=%d\n",a+b);
return 0;
}
argc是命令行參數的個數這里是3
argv存放的是參數,第一個是命令"add_s",第二個是"3",第三個是"2"
㈧ 關於socket通信運行機制的問題(php):
php socket 是以php cli 模式運行的 也就是在伺服器上用命令行執行php xxx.php
而你要保持這個文件的長連接 。就是持久監控。
保持長連接也就是死循環
while(true){
這里寫socket的一些方法
}
這樣他就是會一直執行。設置超時時間為0
這就socket的基本而原理 也是消息隊列的基本原理
㈨ php socket在linux下如何運行
下個相同版本的php源碼,進行編譯安裝,再按照上面步驟搞,生成的so。到rpm裝的那個,修改php.ini進行擴展就行了,
或者到網上找相同版本,相同系統 的編譯好的so文件。
在linux下給PHP安裝socket擴展,參考方法如下:
#cd /usr/soft/php/ext/sockets (進入原php安裝文件下的sockets目錄)
#/usr/local/php/bin/phpize (運行安裝後的php安裝文件下的phpize)
#./configure --prefix=/usr/local/php/lib --with-php-config=/user/local/php/bin/php-config --enable-sockets
#make
#make install
再修改/usr/local/php/etc/php.ini文件
#extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/" (php5.4版本以上不用加擴展路徑)
extension=sockets.so
(若不想修改extension_dir路徑或改路徑下還有別的.so文件,亦可直接寫:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/sockets.so)
重啟apache或者nginx等進程,完成。
以上這篇linux下開啟php的sockets擴展支持實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。