1

I am implementing a program with a server and multiple clients. All clients send data to the server and a server check out the step of each client. If all client's steps are the same, a server sends new data to all clients to do next step. And it continues this procedure again and again.

However, when I run my program, it cannot communicate each other. Here are my code. Would you give me some hints?

client & server

#client
from socket import *
from sys import *
import time
import stat, os
import glob

# set the socket parameters
host = "localhost"
port = 21567
buf = 1024
data = ''
addr = (host, port)

UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.settimeout(100)

def_msg = "=== TEST ==="

#FILE = open("test.jpg", "w+")
FILE = open("data.txt","w+")

while (1):
  #data, addr = UDPSock.recvfrom(buf)
  print "Sending"
  UDPSock.sendto(def_msg, addr)
  #time.sleep(3)
  data, addr = UDPSock.recvfrom(buf)

  if data == 'done':
   FILE.close()
   break
  FILE.write(data)

  print "Receiving"
  #time.sleep(3)

UDPSock.close()

# server program for nvt

from socket import *
import os, sys, time, glob
#import pygame
import stat

host = 'localhost'
port = 21567
buf = 1024
addr = (host, port)

print 'test server'

UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)

msg = "send txt file to all clients"

#FILE = open("cam.jpg", "r+")
FILE = open("dna.dat","r+")
sending_data = FILE.read()
FILE.close()

tmp_data = sending_data

while (1):
  #UDPSock.listen(1)
  #UDPSock.sendto(msg, addr)
  #FILE = open("gen1000.dat","r+")
  #sending_data = FILE.read()
  #FILE.close()


  #print 'client is at', addr
  data, addr = UDPSock.recvfrom(buf)
  #time.sleep(3)
  print data
  #msg = 'hello'

  # 
  tmp, sending_data = sending_data[:buf-6], sending_data[buf-6:]

  if len(tmp) < 1:
    msg = 'done'
    UDPSock.sendto(msg, addr)
    print "finished"
    sending_data = tmp_data

  UDPSock.sendto(tmp, addr)
  print "sending"
  #time.sleep(3)
UDPSock.close()
1

2 Answers 2

1

A server must perform the sequence socket(), bind(), listen(), accept() (possibly repeating the accept() to service more than one client), while a client only needs the sequence socket(), connect().

Your missing listen() i saw first. Listen for connections made to the socket.

More on this here: link text

Sign up to request clarification or add additional context in comments.

Comments

1

Look at this: http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf

It's a very good Python networking tutorial including working examples of a client and server. Now, I'm not an expert on this, but it looks to me like your code is overcomplicated. And what's the deal with all the commented-out lines?

Quote from question:

#UDPSock.listen(1)
#UDPSock.sendto(msg, addr)
#FILE = open("gen1000.dat","r+")
#sending_data = FILE.read()
#FILE.close()

End quote

Those look like some pretty important lines to me.

Also, make sure the computers are connected. From a prompt run:

ping [IP]

where [IP] is the IP address of the other machine(Note: if you're not connected to the same LAN, this becomes much harder as you might then need port forwarding and possibly static IPs).

1 Comment

The document referenced on this answer is no longer available. Apart from that the rest of the answer seems more like a comment than an answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.